rango - Cómo almacenar una fecha y hora en MySQL con información de zona horaria
mysql obtener fecha sin hora (2)
Tengo miles de fotos tomadas en Tanzania y quiero guardar la fecha y la hora de cada foto en una base de datos MySQL. Sin embargo, el servidor se encuentra en los EE. UU. Y tengo problemas cuando intento almacenar una fecha de Tanzania que caiga dentro de la hora "no válida" durante el horario de verano de la primavera (en EE. UU.). Tanzania no hace horario de verano, entonces el tiempo es realmente válido.
Las complicaciones adicionales son que hay colaboradores de diferentes zonas horarias que necesitarán acceder a los valores de fecha y hora almacenados en la base de datos. Quiero que siempre aparezcan como hora de Tanzania y no en los tiempos locales en que se encuentran varios colaboradores.
Soy reacio a establecer horarios de sesiones porque sé que habrá problemas cuando alguien alguna vez se olvide de establecer un horario de sesión y los tiempos de espera salgan mal. Y no tengo autoridad para cambiar nada sobre el servidor.
He leído: las mejores prácticas de hora de verano y zona horaria, los campos de fecha y hora de MySQL y el horario de verano: ¿cómo hago referencia a la hora "extra"? y Almacenando datetime como UTC en PHP / MySQL
Pero ninguno de ellos parece abordar mi problema particular. No soy un experto en SQL; ¿hay alguna manera de especificar la zona horaria al configurar DATETIMEs? No he visto uno. De lo contrario, cualquier sugerencia sobre cómo abordar este tema es muy apreciada.
Editar: Aquí hay un ejemplo del problema con el que me estoy encontrando. Yo envío el comando:
INSERT INTO Images (CaptureEvent, SequenceNum, PathFilename, TimestampJPG)
VALUES (122,1,"S2/B04/B04_R1/IMAG0148.JPG","2011-03-13 02:49:10")
Y obtengo el error:
Error 1292: Incorrect datetime value: ''2011-03-13 02:49:10'' for column ''TimestampJPG''
Esta fecha y hora existe en Tanzania, pero no en los EE. UU., Donde se encuentra la base de datos.
Todos los síntomas que describes sugieren que nunca digas a MySQL qué zona horaria usar, por lo que se establece de manera predeterminada en la zona del sistema. Piénselo: si todo lo que tiene es ''2011-03-13 02:49:10''
, ¿cómo puede adivinar que se trata de una fecha tanzana local?
Hasta donde yo sé, MySQL no proporciona ninguna sintaxis para especificar la información de zona horaria en las fechas. Tienes que cambiarlo por conexión ; algo como:
SET time_zone = ''EAT'';
Si esto no funciona (para usar zonas con nombre, necesita que el servidor haya sido configurado para hacerlo y a menudo no es el caso) simplemente puede usar desplazamientos UTC:
SET time_zone = ''+03:00'';
Tu dijiste:
Quiero que siempre aparezcan como hora de Tanzania y no en los tiempos locales en que se encuentran varios colaboradores.
Si este es el caso, entonces no debe usar UTC. Todo lo que necesita hacer es utilizar un tipo DATETIME
en MySQL en lugar de un tipo TIMESTAMP
.
De la documentación de MySQL :
MySQL convierte los valores de
TIMESTAMP
de la zona horaria actual a UTC para el almacenamiento y de regreso de UTC a la zona horaria actual para su recuperación. (Esto no ocurre con otros tipos, comoDATETIME
).
Si ya está usando un tipo DATETIME
, entonces no debe establecerlo antes de la hora local para comenzar. Tendrá que enfocarse menos en la base de datos y más en el código de su aplicación, que no mostró aquí. El problema y la solución variarán drásticamente según el idioma, así que asegúrese de etiquetar la pregunta con el idioma apropiado del código de la aplicación.