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 :)).
¿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. –
@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 :( –
+1 punto de interés Damien. –