fecha - php datetime time
Almacenamiento de datetime como UTC en PHP/MySQL (6)
En todas partes que leo sobre la conversión del tiempo a la zona horaria de un usuario, se dice que el mejor método es almacenar una fecha y hora en UTC y luego agregar el desplazamiento de la zona horaria del usuario a esta hora.
¿Cómo puedo guardar una fecha en hora UTC? Uso el campo DATETIME de MySQL.
Al agregar un nuevo registro a MySQL en mi código PHP, lo usaría now()
para insertarlo en MySQL DATETIME.
¿Necesitaría usar algo diferente que now()
para almacenar la hora UTC?
Aleatorio: UTC_TIMESTAMP(6)
para el tiempo con 6 dígitos de microsegundos.
MySQL 5.7+
Como sugiere @Haluk, puede almacenar la fecha como una datetime
UTC. Estoy complementando su respuesta para situaciones en las que la fecha que desea insertar proviene del código PHP, y agrego algunos detalles sobre cómo funciona:
$pdo = new PDO(''mysql:host=mydbname.mysql.db;dbname=mydbname'', ''myusername'', ''mypassword'');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$insertStmt = $pdo->prepare("insert into test (last_modified)"
." values(:last_modified)");
$insertStmt->bindParam('':last_modified'', $lastModified, PDO::PARAM_STR);
$lastModified = gmdate("Y-m-d H:i:s");
$insertStmt->execute();
En realidad, datetime
en PHP no tiene una zona horaria asociada. Lo que se pasa a PDO es solo una cadena, en uno de los formatos reconocidos por MySQL, que representa la fecha en la zona horaria UTC. Por ejemplo, si la fecha es 2015-10-21 19:32:33 UTC+2:00
, el código anterior simplemente le dice a MySQL que inserte 2015-10-21 17:32:33
. gmtdate("Ymd H:i:s")
le da la fecha actual en ese formato. En cualquier caso, todo lo que debe hacer es crear la cadena que representa la fecha que desea insertar en la hora UTC.
Luego, cuando lea la fecha, debe decirle a PHP que la zona horaria de la fecha que acaba de recuperar es UTC. Usa el código en la respuesta de Haluk para esto.
MySQL: UTC_TIMESTAMP()
Devuelve la fecha y hora UTC actual como un valor en formato ''YYYY-MM-DD HH: MM: SS'' o YYYYMMDDHHMMSS.uuuuuu, dependiendo de si la función se usa en una cadena o contexto numérico
PHP: gmdate()
También PHP date_default_timezone_set()
se usa en PHP para establecer la zona horaria actual para el script. Puede configurarlo en la zona horaria del cliente para que todas las funciones de formato devuelvan la hora en su hora local.
En verdad, aunque me costó mucho hacer que esto funcionara y siempre me tropiezo con algún problema. P.ej. la información de hora devuelta desde MySQL no tiene el formato ''UTC'', por lo que strtotime transforma en una hora local si no tiene cuidado. Tengo curiosidad por saber si alguien tiene una solución confiable para este problema, una que no se rompa cuando las fechas atraviesan los límites de los medios (HTTP-> PHP-> MySQL y MySQL-> PHP-> HTTP), también considerando XML y RSS /Átomo.
Yo sugeriría insertar la fecha en la zona horaria UTC. Esto le ahorrará muchos dolores de cabeza en el futuro con problemas de ahorro de luz diurna.
INSERT INTO abc_table (registrationtime) VALUES (UTC_TIMESTAMP())
Cuando solicito mis datos, uso el siguiente script PHP:
<?php
while($row = mysql_fetch_array($registration)) {
$dt_obj = new DateTime($row[''message_sent_timestamp''] ." UTC");
$dt_obj->setTimezone(new DateTimeZone(''Europe/Istanbul''));
echo $formatted_date_long=date_format($dt_obj, ''Y-m-d H:i:s'');
}
?>
Puede reemplazar el valor de DateTimeZone
con una de las zonas horarias de PHP disponibles.
https://dba.stackexchange.com/questions/20217/mysql-set-utc-time-as-default-timestamp
Citando todas las respuestas del enlace de arriba en caso de eliminar:
Para continuar con el comentario de @ ypercube de que CURRENT_TIMESTAMP
se almacena como UTC pero se recupera como la zona horaria actual, puede afectar la configuración de la zona horaria de su servidor con la opción --default_time_zone para la recuperación. Esto permite que su recuperación esté siempre en UTC.
De forma predeterminada, la opción es ''SISTEMA'', que es la forma en que se configura la zona horaria del sistema (que puede ser UTC o no):
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
1 row in set (0.00 sec)
mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 16:28:45 |
+---------------------+
1 row in set (0.00 sec)
Puedes configurar esto dinámicamente:
mysql> SET @@session.time_zone=''+00:00'';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | +00:00 |
+--------------------+---------------------+
1 row in set (0.00 sec)
O permanentemente en tu my.cnf:
[mysqld]
**other variables**
default_time_zone=''+00:00''
Reinicie su servidor, y verá el cambio:
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| +00:00 | +00:00 |
+--------------------+---------------------+
1 row in set (0.00 sec)
mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 20:27:50 |
+---------------------+
1 row in set (0.01 sec)
NOW()
le da el tiempo (incluido el desplazamiento de la zona horaria) del sistema que ejecuta su base de datos. Para obtener la fecha / hora de UTC, debe usar UTC_TIMESTAMP()
como se describe en el UTC_TIMESTAMP() .