2011-09-26 8 views
15

Sé que DateTimeOffset almacena una fecha/hora UTC y un desplazamiento. También sé por this MSDN blog entry que DateTimeOffset debe usarse para "Trabajar con horario de verano".¿Cómo funciona DateTimeOffset con el horario de verano?

Lo que estoy tratando de entender es exactamente cómo DateTimeOffset "funciona (s) con horario de verano". Mi comprensión, poco que hay, es que los tiempos de ahorro de luz natural son una decisión política y no se pueden deducir de una compensación pura. ¿Cómo puede ser que esta estructura sea compatible con DST si solo almacena un desplazamiento?

Supongo que puede haber una manera de utilizar la clase TimeZoneInfo junto con DateTimeOffset. ¿Como podría hacerlo?

Finalmente, ¿hay alguna forma mejor de lograr lo siguiente?

(He visto algunas publicaciones de Jon Skeet sobre Noda-Time, pero entiendo que todavía no está lista para producción y no sé si se integrará bien en nuestra solución existente).

Aquí está nuestro escenario. El servidor es por razones heredadas desafortunadas que se ejecutan en el Reino Unido. Tenemos clientes que comienzan a llegar desde Australia que tienen varias zonas horarias. Otros países podrían entrar en funcionamiento en cualquier momento.

Tenemos un planificador que se basa en el Hardcodet scheduler (usa DateTimeOffset). Funciona muy bien. Sin embargo, en nuestra base de datos solo almacenamos suficientes datos para construir un objeto DateTime (ver más abajo) y en nuestro código de subclassed y plomería simplemente usamos DateTime, ya que originalmente solo admitíamos usuarios del Reino Unido.

Este programador es responsable de inmovilizar y movilizar el equipo de la planta. Por lo tanto, es vital que los eventos programados se ejecuten en la hora local ajustada por DST del usuario.

El usuario ingresa un horario en nuestro sitio web; actualmente esto se almacena en la base de datos como día de la semana, hora y minuto. Cuando se leen los datos, creamos un objeto DateTime para la próxima ocurrencia de ese día, hora y minuto. Soy libre de alterar la estructura db para almacenar adicionalmente un desplazamiento o zona horaria.

Cuando llega esa fecha y hora, el planificador envía el comando (y vuelve a intentarlo durante un tiempo). A continuación, se ejecutará nuevamente el mismo día y hora de la próxima semana (aunque el servicio en realidad ya habrá sido reciclado y el código se habrá ejecutado nuevamente).

TODO lo que necesito lograr es la activación de eventos programados en la fecha y hora local ajustadas a la zona horaria para ese usuario que usa un programador cuyas subclases de Hardcodet. Si DateTimeOffset es realmente consciente de DST, puede ser que todo lo que necesite hacer sea almacenar un desplazamiento y cambiar nuestro código de plomería para usar esta estructura, pero me da la impresión de que no es tan simple. (Es posible que podamos obtener la zona horaria actual desde la posición GPS de la planta, pero eso es una discusión para otro día :)).

+3

¿Qué sucede si el "siguiente" día y hora caen en la brecha durante una transición DST? Es decir. ese momento nunca ocurre en ese día, ya que el tiempo se adelanta una hora entera. No creo que haya una solución mágica que pueda simplemente enchufarse. –

+1

@Damien_The_Unbeliever es un buen punto, y debería considerarse lo contrario: una hora local puede ocurrir dos veces en el mismo día. Noda Time le obliga a considerar estas opciones cuando convierte de LocalDateTime a ZonedDateTime; .NET no :( –

+0

+1 punto de interés Damien. –

Respuesta

23

DateTimeOffset en sí no es realmente compatible con DST, pero TimeZoneInfo es. Un DateTimeOffset representa un instante fijo en el tiempo, por lo que obtiene a a DateTimeOffset a través de un código de zona horaria. En otras palabras, si pedí un DateTimeOffset ahora en el Reino Unido, terminaría con algo con un desplazamiento de +1 hora desde UTC. Si solicité un DateTimeOffset durante algún tiempo en diciembre en el Reino Unido, terminaría con algo con un desplazamiento de 0 horas desde UTC.

Si cambia su base de datos para incluir el y compensar se crea el DateTimeOffset a partir del usuario elegido DateTime (que debe ser del tipo "no especificado") y su zona de tiempo, entonces eso debería darle el desplazamiento correcto teniendo el horario de verano en cuenta.

Una cosa a tener en cuenta: si programo algo ahora por "2 años" y determina el desplazamiento ahora, ese desplazamiento puede no ser correcto en el futuro; por ejemplo, el gobierno podría cambiar cuando Se aplica DST, y obviamente eso no va a cambiar lo que está almacenado en su base de datos.

+0

@ Jon Is Noda Time está listo para el uso de producción en un escenario como este? –

+0

@StephenKennedy: No conozco ningún problema relacionado con los cálculos de la zona horaria, etc. La mayor parte del trabajo anterior a la versión 1.0 se refiere al formato/análisis de texto. Dado que * no * hemos llegado a 1.0, sería * precavido * sobre la adopción, si estuviera en su lugar, querría muchas pruebas para su caso de uso específico, pero si necesita ayuda para usar Noda. Tiempo, estaría encantado de ayudar, y estoy seguro de que otros miembros de la lista de correo también lo estarían. –

+0

Gracias Jon. El 99% de la batalla aquí es almacenar algo adecuado en el DB y construir una instancia de DateTimeOffset a partir de esos datos para la hora de inicio del objeto Job . El objeto Job con una carga útil, hace el trabajo y el planificador subyacente ya funciona. Descargo Noda Time y RTFM para intentar controlar si esto podría ser adecuado. Eso es si no tengo éxito en mi lanzamiento, deberíamos hacer todo en UTC y dejar que los usuarios finales se preocupen por el horario de verano, sobre todo por los problemas que planteó Damien :) –

Cuestiones relacionadas