sql >> Base de Datos >  >> RDS >> Mysql

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

Del manual (sección 9.6 ):

Los valores actuales de las zonas horarias globales y específicas del cliente se pueden recuperar así:
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 es menos que útil. Como estás usando PHP, si la respuesta de MySQL es SYSTEM , luego puede preguntarle al sistema qué zona horaria es usando vía date_default_timezone_get . (Por supuesto, como señaló VolkerK, PHP puede estar ejecutándose en un servidor diferente, pero según las suposiciones, asumiendo que el servidor web y el servidor DB con el que está hablando están configurados en [si no está realmente en ] la misma zona horaria no es un enorme salto.) Pero tenga en cuenta que (al igual que con MySQL), puede establecer la zona horaria que utiliza PHP (date_default_timezone_set ), lo que significa que puede informar un valor diferente al que está usando el sistema operativo. Si tiene el control del código PHP, debe saber si lo está haciendo y estar bien.

Pero toda la cuestión de qué zona horaria está usando el servidor MySQL puede ser una tangente, porque preguntarle al servidor en qué zona horaria está le dice absolutamente nada. sobre los datos en la base de datos. Siga leyendo para obtener más información:

Discusión adicional :

Si tiene el control del servidor, por supuesto que puede asegurarse de que la zona horaria sea una cantidad conocida. Si no tiene el control del servidor, puede establecer la zona horaria utilizada por su conexión así:

set time_zone = '+00:00';

Eso establece la zona horaria en GMT, de modo que cualquier otra operación (como now() ) usará GMT.

Tenga en cuenta, sin embargo, que los valores de fecha y hora no almacenado 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)

Por lo tanto, conocer la zona horaria del servidor solo es importante en términos de funciones que obtienen la hora en este momento, como now() , unix_timestamp() , etc.; no le dice nada sobre qué zona horaria están usando las fechas en los datos de la base de datos. Puede optar por asumir se escribieron usando la zona horaria del servidor, pero esa suposición bien puede ser errónea. Para conocer la zona horaria de cualquier fecha u hora almacenada en los datos, debe asegurarse de que estén almacenados con la información de la zona horaria o (como hago yo) asegurarse de que siempre estén en GMT.

¿Por qué supone que los datos se escribieron utilizando la zona horaria del servidor con fallas? Bueno, por un lado, los datos pueden haber sido escritos usando 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 mudado de Texas a California). Pero incluso si los datos están escritos en el servidor, con su zona horaria actual, todavía es ambiguo. El año pasado, en los 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 a. m. del 1 de noviembre PDT o a la 1:30 a. m. 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 DST) y conviértalas a la zona horaria deseada cuando sea necesario.