2008-10-21 13 views
9

Básicamente estoy convirtiendo las fechas locales almacenadas en la base de datos en UTC. Pero he leído en algún lado que las reglas de ahorro de luz diurna han cambiado en 2007. Por lo tanto, la función Date.ToUniversalTime() todavía funciona correctamente. Básicamente, las fechas anteriores a 2007 (cuando las nuevas reglas entraron en vigor) se convertirían correctamente, pero las fechas posteriores no lo serían. ¿Estoy aquí? ¿O .Net se encargaría de la conversión internamente, es decir, dependiendo de las diferentes reglas de horario de verano?Cambios en el horario de verano que afectan la conversión UTC

EDITAR: Las fechas se almacenan en DB como hora local. Lo estoy convirtiendo en UTC. Por lo tanto, una fecha como '9 de marzo de 2005' debe convertirse utilizando las reglas de luz diurna de 2005 en lugar de las reglas de hoy. Las reglas cambiaron en los Estados Unidos en 2007. Por lo tanto, la fecha sale mal en una hora.

Respuesta

3

Depende de la versión de .NET que esté utilizando y, posiblemente, de la versión de Windows que esté utilizando. .NET 3.5 tiene la clase TimeZoneInfo que incluye cambios históricos, etc., antes de eso, el soporte era mucho más irregular, desafortunadamente.

+1

¿Cómo podría funcionar esto? TimeZoneInfo necesitaría saber cuándo se agregó el valor a la base de datos para saber qué reglas aplicar –

+0

Windows comenzó a admitir un rico modelo de zona horaria (con cambios históricos) hace relativamente poco tiempo, posiblemente con 2K3 o incluso Vista y paquetes de servicios para usuarios mayores. Sistemas operativos. El soporte de .NET se usa para seguir el modelo anterior (un conjunto de reglas, aplicadas perpetuamente). TimeZoneInfo sigue el nuevo modelo. –

+0

Sí, pero supongo que tengo esta fecha en el archivo db: "2005-03-10 03:30" (expresada en "hora local") ¿Cómo TimeZoneInfo puede convertir esta fecha a hora UTC sin saber qué reglas del horario de verano se usaron para guardarla en ¿El primer lugar? –

1

Espero que ToUniversalTime() lo tenga en cuenta. ¿Has probado y comprobado el resultado con las fechas de antes y después del cambio de horario de verano?

EDITAR

Si sabes el desplazamiento de todas las fechas en su zona horaria DB, que definitivamente se recomiendan para convertirlos a UTC en el nivel de tabla. Deshazte de muchos dolores de cabeza de esa manera. La conversión a la hora local para fines de visualización es más fácil.

+0

Sí, las fechas anteriores a 2007 están saliendo incorrectamente durante 2 meses porque .Net está siguiendo las reglas de ahorro de luz del día de hoy. –

1

Depende de cómo se almacena la información en la base de datos.

Afortunadamente, los datos en el archivo db contienen el desplazamiento UTC, y si es así, cualquier cambio en las reglas de horario de verano será irrelevante.

Si no se conoce el desplazamiento UTC, es prácticamente imposible saber cómo convertirlo a UTC. Por ejemplo, si la hora se almacena como un entero sin metadatos, el sistema debería saber cuando se agregó al archivo db para poder determinar la marca de tiempo UTC correspondiente.

+0

La hora se almacena como hora local en DB. Necesita convertirse a UTC obedeciendo las reglas de ahorro de luz diurna en ese momento. –

+0

Los cambios en las reglas de ahorro de luz natural no serán irrelevantes, si está convirtiendo a la hora local para mostrarlos, y está mostrando fechas antiguas/veces, se equivocarán :( –

+0

@Jon: ah, quiere decir la respuesta a la pregunta "¿Fue esta fecha durante el período de horario de verano o no?" Si es así, asegúrese de que las reglas sean relevantes. Pero no para la conversión a UTC (ya que la fecha actual en el archivo db contiene el desplazamiento real) –

1

odio decirlo, pero usted es atornillado. Muerda la viñeta y cambia las fechas en la base de datos a UTC antes de que el problema empeore. Su código se convertirá en una pesadilla de fecha de caso especial-matemática en un lapso de tiempo fijo si continúa intentando almacenar horas locales en la base de datos.

compromiso: almacene la hora local y la hora UTC en columnas separadas; al menos entonces tendrá una referencia

ver this post para más razones que nunca para almacenar db veces en la hora local

Cuestiones relacionadas