2011-01-09 88 views
7

¿Qué es una forma práctica de almacenar las fechas para que los usuarios puedan ver y consultar datos en su propia hora local mientras se mantiene información sobre la fecha y hora original?Cómo almacenar las fechas en UTC y la zona horaria local

Básicamente, los usuarios desean poder consultar (a partir de su propia hora local) los datos recopilados de los sistemas en varias zonas horarias. Pero, de vez en cuando, quieren saber que los datos se crearon, digamos, a las 18:00 en el sistema original. Ayuda cuando los usuarios de diferentes partes del mundo se comunican sobre el mismo evento.

User1: What? We don't have any data for 20:00 
User2: Dude, it says 20:00 right there on my screen. 
User1: Wait, what timezone are you? What's the UTC-time? 
User2: What is UTC? Is that something with computers? 
User1: OMFG! *click* 

Estoy buscando consejos sobre cómo almacenar los datos.

Estoy pensando en almacenar todas las fechas en UTC y agregar una columna adicional que contenga el nombre original de la zona horaria, en una forma que me permita usar mysql CONVERT_TZ, o la contraparte en Java. La aplicación convertiría las fechas ingresadas por el usuario en UTC y puedo consultar fácilmente la base de datos. Todas las fechas también se pueden convertir fácilmente a la hora local de los usuarios en la aplicación. Usando la columna original de la zona horaria también podría mostrar la fecha y hora original.

Sin embargo, esto significa que para cada fecha y hora que tengo, necesito una columna adicional ...

start_time_utc datetime 
start_time_tz varchar(64) 
end_time_utc datetime 
end_time_tz varchar(64) 

estoy en el camino correcto aquí?

¿Alguien que haya trabajado con esos datos compartirá sus experiencias?

(Me va a utilizar MySQL 5.5 CE)

Actualización 1

de datos será entregado en archivos XML que cada entrada tiene una fecha y hora en alguna zona horaria local. Entonces solo habrá un proceso de inserción, ejecutándose en un solo lugar.

Una vez cargado en la base de datos, se presentará en alguna aplicación web a usuarios en diferentes zonas horarias. Para la mayoría de los casos de uso, los datos de interés también se originaron en la misma zona horaria que el usuario que mira los datos. Para algunos de los casos de uso más complicados, una serie de eventos están interconectados y abarcan varias zonas horarias. Por lo tanto, los usuarios desean poder hablar de los eventos para investigar las posibles causas/consecuencias en el momento del otro. No es UTC, no es su hora local.

+1

Para el problema en cuestión, creo que su solución es buena. –

+0

¿MySQL no tiene 'DateTimeOffset', como MSSQL (un tipo de datos que especifica una marca de tiempo y su desplazamiento de UTC)? Si no es así, entonces su solución es el equivalente más cercano, que difiere solo en la cantidad de campos necesarios (1 frente a 2). – bzlm

+0

No, MySQL no admite 'TIMESTAMP WITH TIMEZONE' (que es el tipo de datos ANSI para esto) –

Respuesta

4

El manual tiene una sección sólo para este, alrededor de marca de tiempo:

valores TIMESTAMP se convierten de la zona horaria actual a UTC para almacenamiento, y convertidos de nuevo a partir de UTC a la zona de tiempo actual para recuperación. (Esto ocurre solo para el tipo de datos TIMESTAMP , no para otros tipos tales como DATETIME.) De forma predeterminada, la zona horaria actual para cada conexión es la hora del servidor. La zona horaria se puede configurar en un por conexión, como se describe en Sección 9.6, "Zona horaria del servidor MySQL Soporte". Siempre que la configuración de la zona horaria permanezca constante, obtendrá de vuelta el mismo valor que almacena.Si almacena un valor TIMESTAMP, y luego cambia la zona horaria y recupera el valor, el valor recuperado es diferente del valor que guardó. Esto ocurre porque el mismo huso horario no se usó para la conversión en ambas direcciones. La zona horaria actual está disponible como el valor de la variable time_zone system .

http://dev.mysql.com/doc/refman/5.5/en/timestamp.html

Así que usted puede utilizar: SET time_zone = timezone; en el cliente para establecer la zona horaria. Entonces, todas las consultas traducirían la marca de tiempo al huso horario correcto. No es necesario hacer nada complejo en Java, excepto configurar el huso horario (creo que incluso podría ser un parámetro en la cadena de conexión JDBC)

+0

Aún necesitaría almacenar la zona horaria original para mostrarla en otra zona horaria local (ver el diálogo). – Ronnis

+0

Tal vez lo malentendí. Así que, como dijo Eldad, almacenar la zona horaria original con la columna es tu única opción ... – shlomoid

0

Siempre puede obtener el zulu time como base para todos sus cálculos.

5

Como los usuarios pueden vivir en diferentes zonas horarias e incluso pueden pasar de una zona horaria a otra, la mejor práctica es almacenar la fecha y la hora en UTC y convertirla a la zona horaria del usuario en el momento de la visualización.

Cuestiones relacionadas