¿Cómo obtengo la zona horaria actual de MySQL?

Resuelto user198729 asked hace 14 años • 19 respuestas

¿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_zonese está utilizando, está bien; también podemos involucrarnos PHPsiempre que pueda obtener información válida (no como SYSTEM)

user198729 avatar May 29 '10 14:05 user198729
Aceptado

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 SYSTEMsi 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:00en 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.

T.J. Crowder avatar May 29 '2010 07:05 T.J. Crowder

La siguiente consulta devuelve la zona horaria de la sesión actual.

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
JohnZ avatar Oct 21 '2010 05:10 JohnZ

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.

Andrew avatar Nov 24 '2011 20:11 Andrew

Como menciona Jakub Vrána (el creador o administrador de NotORM ) en los comentarios, para seleccionar el desplazamiento de zona horaria actual en TIMEuso:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Volverá: 02:00:00si 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?

Timo Huovinen avatar Sep 28 '2013 16:09 Timo Huovinen

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  |
+-------+

ttrasn avatar Jan 07 '2020 11:01 ttrasn