cambiar zona horaria mysql
¿Cómo obtengo la zona horaria actual de MySQL? (15)
¿Alguien sabe si existe tal función 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 |
+--------------------+---------------------+
O tal vez MySQL no puede saber exactamente el time_zone
utilizado, está bien, podemos involucrar PHP
aquí, siempre que pueda obtener información válida no como SYSTEM
...
Como Jakub Vrána (El creador o Adminer y NotORM ) menciona en los comentarios, para seleccionar el desfase de la zona horaria actual en el uso de TIME
:
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
Volverá: 02:00:00
si su zona horaria es +2: 00 para esa fecha
Hice una hoja de trucos aquí: ¿Debería MySQL tener su zona horaria configurada en UTC?
Consulte el soporte de Zona horaria en mySQL y la time_zone
sistema time_zone
. ¿Eso ayuda?
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 como esclavo en la zona horaria del sistema, lo cual es menos que útil. Como usa PHP, si la respuesta de MySQL es SYSTEM
, puede preguntar 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 según suposiciones, asumiendo que el servidor web y el servidor de base de datos con el que está hablando están configurados en [si no están realmente en ] la misma zona horaria no es una gran salto). Pero tenga cuidado (como con MySQL), puede configurar la zona horaria que PHP usa ( 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 estás haciendo eso 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 está no le dice absolutamente nada sobre los datos en la base de datos. Sigue leyendo para más detalles:
Discusión adicional :
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'';
Eso establece la zona horaria en GMT, por lo que cualquier operación adicional (como now()
) usará 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)
Por lo tanto, conocer la zona horaria del servidor solo es importante en términos de funciones que obtienen el tiempo ahora mismo, 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 suponer que fueron escritos utilizando la zona horaria del servidor, pero esa suposición puede ser defectuosa. Para conocer la zona horaria de las fechas u horas almacenadas en los datos, debe asegurarse de que estén almacenadas con la información de la zona horaria o, como yo lo hago, asegúrese de que estén siempre en GMT.
¿Por qué se supone que los datos se escribieron utilizando la zona horaria del servidor defectuosa? Bueno, para empezar, los datos pueden haber sido escritos usando una conexión que establece una zona horaria diferente. La base de datos pudo haber sido movida de un servidor a otro, donde los servidores estaban en diferentes zonas horarias (me topé 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, sigue siendo ambiguo. El año pasado, en los Estados Unidos, el horario de verano se apagó a las 2:00 a. M. Del 1 de noviembre. Supongamos que mi servidor está en California utilizando la zona horaria del Pacífico y tengo el valor 2009-11-01 01:30:00
en la base de datos. ¿Cuando fue? ¿Fue eso 1:30 a.m. 1 de noviembre PDT, o 1:30 a.m. 1 de noviembre PST (una hora más tarde)? No tienes absolutamente ninguna manera de saberlo. Moraleja: siempre almacene las fechas / horas en GMT (que no hace DST) y conviértalas a la zona horaria deseada como / cuando sea necesario.
Inserte un registro ficticio en una de sus bases de datos que tenga una marca de tiempo Seleccione ese registro y obtenga el valor de la marca de tiempo. Eliminar ese registro Obtiene la zona horaria que el servidor está utilizando para escribir datos e ignora las zonas horarias de PHP.
Intenta usar el siguiente código:
//ASP CLASSIC
Set dbdate = Server.CreateObject("ADODB.Recordset")
dbdate.ActiveConnection = MM_connection
dbdate.Source = "SELECT NOW() AS currentserverdate "
dbdate.Open()
currentdate = dbdate.Fields("currentserverdate").Value
response.Write("Server Time is "¤tdate)
dbdate.Close()
Set dbdate = Nothing
La siguiente consulta devuelve la zona horaria de la sesión actual.
select timediff(now(),convert_tz(now(),@@session.time_zone,''+00:00''));
Mi framework PHP usa
SET LOCAL time_zone=''Whatever''
después de conectar, donde ''Whatever'' == date_default_timezone_get
No es mi solución, pero esto garantiza que la zona horaria SYSTEM
del servidor MySQL sea siempre la misma que la de PHP.
Entonces, sí, PHP está fuertemente involucrado y puede afectarlo
Para obtener la hora actual según su zona horaria, puede usar lo siguiente (en mi caso es ''+5: 30'')
seleccione DATE_FORMAT (convert_tz (ahora (), @@ session.time_zone, ''+ 05:30''), ''% Y-% m-% d'')
Para obtener la zona horaria actual del mysql, puede hacer lo siguiente:
- SELECCIONE @@ system_time_zone; // a partir de esto puede obtener el sistema de zona horaria
- SELECT IF (@@ session.time_zone = ''SYSTEM'', @@ system_time_zone, @@ session.time_zone) // Esto le dará la zona horaria si la zona horaria del sistema es diferente de la zona horaria global
Ahora, si quiere cambiar la zona horaria mysql, entonces: 1. SET GLOBAL time_zone = ''+00: 00'' // esto configurará la zona horaria mysql en UTC 2. SET @@ session.time_zone = "+00: 00"; // con esto puedes cambiar la zona horaria solo para tu sesión en particular
Puede ser tan estúpido como esto
seleccione timediff (current_time (), utc_time ())
como es todo mysql
no obtendrás directamente el valor de la zona horaria de esta manera, pero si no hubiera otra forma ...
@@ global.time_zone no se puede utilizar a la vista ya que es una variable, y devuelve un valor bastante inutilizable ''SYSTEM'' (no tengo por qué alguien se molestó con él)
si necesita usar su consulta en una sesión con time_zone cambiado (por sesión SET TIME_ZONE =) lo obtendrá con @@ session.time_zone si consulta @@ global.time_zone obtendrá ''SYSTEM'' catch 22
Si intentas con dateiff, date_sub o timediff con now () y utc_time (), probablemente te encuentres con problemas de conversión silenciados por un servidor
La peor documentación que he visto nunca te ayudó.
Excelente trabajo, todos!
Pero el algo sugerido anteriormente probablemente funcionará al menos con algunas versiones de servidor como la mía (5.5.43-37) solución hospedada.
Simplemente SELECT @@system_time_zone;
Devuelve PST
(o lo que sea relevante para su sistema).
Si está intentando determinar la zona horaria de la sesión, puede usar esta consulta:
SELECT IF(@@session.time_zone = ''SYSTEM'', @@system_time_zone, @@session.time_zone);
Que devolverá la zona horaria de la sesión si difiere de la zona horaria del sistema.
Solo necesita reiniciar mysqld después de alterar la zona horaria del sistema.
El huso horario global de MySQL toma la zona horaria del sistema. Cuando cambias cualquier atributo del sistema, solo necesitas reiniciar Mysqld.
Use LPAD (TIME_FORMAT (TIMEDIFF (NOW (), UTC_TIMESTAMP), ''% H:% i''), 6, ''+'' para obtener un valor en el formato de zona horaria de MySQL que pueda usar convenientemente con CONVERT_TZ (). Tenga en cuenta que el desplazamiento de la zona horaria que obtiene solo es válido en el momento en que se evalúa la expresión, ya que el desplazamiento puede cambiar con el tiempo si tiene horario de verano. Sin embargo, la expresión es útil junto con NOW () para almacenar el desplazamiento con la hora local, lo que elimina la ambigüedad de lo que produce NOW (). (En las zonas horarias DST, NOW () retrocede una hora una vez al año, por lo tanto tiene algunos valores duplicados para distintos puntos en el tiempo).
seleccione sec_to_time (TIME_TO_SEC (curtime ()) + 48000); aquí puede especificar sus diferencias de tiempo como seg
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`
Esto devolverá la zona horaria como un número entero (por ejemplo: -6
), manejando tiempos positivos o negativos (aquí es donde entra en juego EXTRACT
: la función HOUR
solo devuelve zonas horarias negativas como positivas).