Creo que mantener sus valores de fecha y hora en el campo de tipo DATETIME sería una especie de forma natural.
Desde mi propia experiencia con mi aplicación PHP actual, solo read / write las operaciones relacionadas con esta información pueden ser problemáticas.
Una de las posibles soluciones (asumiendo que usas DATETIME tipo de datos) para realizar correctamente todo el proceso podría ser el siguiente enfoque:
Lectura de valores DATETIME para uso de PHP
- Adquirir
DATETIMEcampos de su base de datos convirtiéndolos en la consulta a la representación de cadena en forma de'2011-10-02T23:25:42Z'usandoDATE_FORMATFunción MySQL con'%Y-%m-%dT%H:%i:%sZ'cadena de formato (docs el DATE_FORMAT ) - Lea el valor de la columna obtenida en este formato específico y conviértalo en PHP de una cadena a una representación de fecha y hora real válida para PHP (como
DateTimeobjetos de clase yDateTime::createFromFormatmétodo estático dado'Y-m-d\TH:i:s\Z'cadena de formato (TyZse escapan para evitar tratarlos como directivas de formato) (docs para el método ). - Utilice valores convertidos como valores reales de fecha y hora con toda la lógica aplicable, como comparaciones de fechas reales (no comparaciones de texto), etc.
Escribir fecha y hora de PHP en la base de datos MySQL
- Convertir, es decir, PHP
DateTimeobjeto de clase a nuestro ISO 8601 en representación de cadena de formato UTC usandoDateTimeformatdel objeto de clase método con el mismo que antes'Y-m-d\TH:i:s\Z'cadena de formato (documentación ). - Ejecutar
INSERT/UPDATEoperación en la información de la base de datos utilizando dicha cadena preparada como parámetro para la función MySQLSTR_TO_DATE(con'%Y-%m-%dT%H:%i:%sZ'cadena de formato) que la convierte en una base de datos realDATETIMEvalue (documentos el STR_TO_DATE ).
Código de ejemplo en PHP
A continuación, encontrará un borrador de ejemplo de dicho enfoque utilizando objetos PDO:
$db = new PDO('mysql:host=localhost;dbname=my_db;charset=utf8', 'username', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
// run the query aquring 1 example row with DATETIME data
// converted with MySQL DATE_FORMAT function to its string representation
// in the chosen format (in our case: ISO 8601 / UTC)
$stmt = $db->query("SELECT DATE_FORMAT(dt_column, '%Y-%m-%dT%H:%i:%sZ') AS formatted_dt_col"
." FROM your_table LIMIT 1");
if($stmt !== FALSE) {
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// convert the acquired string representation from DB
// (i.e. '2011-10-02T23:25:42Z' )
// to PHP DateTime object which has all the logic of date-time manipulation:
$dateTimeObject = DateTime::createFromFormat('Y-m-d\TH:i:s\Z', $row['formatted_dt_col']);
// the following should print i.e. 2011-10-02T23:25:42Z
echo $dateTimeObject->format('Y-m-d\TH:i:s\Z');
// now let's write PHP DateTime class object '$dateTimeObject'
// back to the database
$stmtInsertDT = $db->prepare("INSERT INTO your_table(dt_column) "
. " VALUES ( STR_TO_DATE(:par_formatted_dt_column, '%Y-%m-%dT%H:%i:%sZ') )");
$dtAsTextForInsert = $dateTimeObject->format('Y-m-d\TH:i:s\Z');
// convert '$dateTimeObject' to its ISO 8601 / UTC text represantation
// in order to be able to put in in the query using PDO text parameter
$stmtInsertDT->bindParam(':par_formatted_dt_column', $dtAsTextForInsert, PDO::PARAM_STR);
$stmtInsertDT->execute();
// So the real insert query being perform would be i.e.:
/*
INSERT INTO your_table(dt_column)
VALUES ( STR_TO_DATE('2011-10-02T23:25:42Z', '%Y-%m-%dT%H:%i:%sZ') )
*/
}
}
catch(\PDOException $pexc) {
// serve PDOException
}
catch(\Exception $exc) {
// in case of no-PDOException, serve general exception
}
Este enfoque me ayudó mucho a operar valores de fecha y hora entre PHP y la base de datos MySQL.
Espero que también te resulte útil.