¿Cómo obtengo la zona horaria actual de MySQL?
¿Alguien sabe si existe una función para obtener la configuración de zona horaria del servidor en MySQL?
ACTUALIZAR
Esto no genera ninguna información válida:
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
Si MySQL no puede saber exactamente qué time_zone
se está utilizando, está bien; también podemos involucrarnos PHP
siempre que pueda obtener información válida (no como SYSTEM
)
Del manual ( sección 9.6 ):
Los valores actuales de las zonas horarias globales y específicas del cliente se pueden recuperar de esta manera:
mysql> SELECT @@global.time_zone, @@session.time_zone;
Editar Lo anterior devuelve SYSTEM
si MySQL está configurado para usar la zona horaria del sistema, lo cual no es muy útil. Como estás usando PHP, si la respuesta de MySQL es SYSTEM
, puedes preguntarle al sistema qué zona horaria está usando a través de date_default_timezone_get
. (Por supuesto, como señaló VolkerK, PHP puede estar ejecutándose en un servidor diferente, pero como se supone, asumir que el servidor web y el servidor de base de datos con el que está hablando están configurados [si no en ] la misma zona horaria no es un gran salto.) Pero tenga en cuenta que (al igual que con MySQL), puede configurar la zona horaria que usa PHP ( date_default_timezone_set
), lo que significa que puede informar un valor diferente al que usa el sistema operativo. Si tienes el control del código PHP, debes saber si lo estás haciendo y estar bien.
Pero toda la cuestión de qué zona horaria está utilizando el servidor MySQL puede ser una tangente, porque preguntarle al servidor en qué zona horaria se encuentra no le dice absolutamente nada sobre los datos de la base de datos. Siga leyendo para obtener más detalles:
Más discusión :
Si tiene el control del servidor, por supuesto, puede asegurarse de que la zona horaria sea una cantidad conocida. Si no tienes el control del servidor, puedes configurar la zona horaria utilizada por tu conexión de esta manera:
set time_zone = '+00:00';
Esto establece la zona horaria en GMT, de modo que cualquier operación adicional (como now()
) utilizará GMT.
Sin embargo, tenga en cuenta que los valores de fecha y hora no se almacenan con información de zona horaria en MySQL:
mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)
mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 | <== Note, no change!
+---------------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 08:32:38 | <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)
Entonces, conocer la zona horaria del servidor solo es importante en términos de funciones que obtienen la hora en este momento, como por ejemplo now()
, unix_timestamp()
etc.; no le dice nada sobre qué zona horaria utilizan las fechas en los datos de la base de datos. Puede optar por asumir que fueron escritos utilizando la zona horaria del servidor, pero esa suposición puede ser errónea. Para conocer la zona horaria de cualquier fecha u hora almacenada en los datos, debe asegurarse de que estén almacenadas con información de zona horaria o (como hago yo) asegurarse de que siempre estén en GMT.
¿Por qué es incorrecto suponer que los datos se escribieron utilizando la zona horaria del servidor? Bueno, por un lado, es posible que los datos se hayan escrito utilizando una conexión que estableció una zona horaria diferente. Es posible que la base de datos se haya movido de un servidor a otro, donde los servidores estaban en diferentes zonas horarias (me encontré con eso cuando heredé una base de datos que se había movido de Texas a California). Pero incluso si los datos están escritos en el servidor, con su zona horaria actual, siguen siendo ambiguos. El año pasado, en Estados Unidos, el horario de verano se apagó a las 2:00 am del 1 de noviembre. Supongamos que mi servidor está en California usando la zona horaria del Pacífico y tengo el valor 2009-11-01 01:30:00
en la base de datos. ¿Cuando fue? ¿Fue a la 1:30 am del 1 de noviembre PDT, o a la 1:30 am del 1 de noviembre PST (una hora más tarde)? No tienes absolutamente ninguna forma de saberlo. Moraleja: almacene siempre las fechas/horas en GMT (que no hace horario de verano) y conviértalas a la zona horaria deseada cuando sea necesario.
La siguiente consulta devuelve la zona horaria de la sesión actual.
select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
Simplemente
SELECT @@system_time_zone;
Devoluciones PST
(o lo que sea relevante para su sistema).
Si está intentando determinar la zona horaria de la sesión, puede utilizar esta consulta:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);
Lo cual devolverá la zona horaria de la sesión si difiere de la zona horaria del sistema.
Como menciona Jakub Vrána (el creador o administrador de NotORM ) en los comentarios, para seleccionar el desplazamiento de zona horaria actual en TIME
uso:
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
Volverá: 02:00:00
si su zona horaria es +2:00 para esa fecha
Hice una hoja de referencia aquí: ¿Debería MySQL tener su zona horaria configurada en UTC?
Cualquiera que venga a buscar la zona horaria de mysql db.
Con esta consulta puede obtener la zona horaria actual:
mysql> SELECT @@system_time_zone as tz;
+-------+
| tz |
+-------+
| CET |
+-------+