Trabajos programados durante las horas de cambio de horario de otoño


12

Me pregunto cómo otras personas lidian con este escenario.

¿Qué pasa si tiene un trabajo programado para ejecutarse a la 1:30 am? En otoño, cuando cambia el tiempo, la hora de 1:00:00 a 1:59:59 se repite y el trabajo se ejecutará dos veces.

Podría ser el Programador de tareas de Windows, el Agente SQL o cualquier otra herramienta de programación. La mayoría de estas herramientas parecen estar basadas en el tiempo de la máquina, no en el tiempo UTC. Si le dijera que ejecute el trabajo a la hora UTC todas las noches, entonces no tendría el problema de la hora duplicada.


1
No pude encontrar nada más actual, pero espero que esto arroje algo de luz sobre el problema para usted - support.microsoft.com/kb/325413
joeqwerty

Eso es excelente, ¿por qué no publicar una respuesta?
NealWalters

Bueno, en realidad no te da una solución (al menos no que yo pudiera discernir al leerlo) pero pensé que sería útil para entender el problema. Estoy feliz de dejarlo como un comentario.
joeqwerty

Respuestas:


10

La programación adecuada de las tareas futuras por hora local, teniendo en cuenta las zonas horarias y el horario de verano, es un tema muy complejo. He escrito sobre esto antes desde una perspectiva de programación en Stack Overflow aquí y aquí .

Resumiré desde una perspectiva no programada:

  • Defina sus patrones de recurrencia por hora local , no UTC . Por ejemplo, si configura un despertador diario para que se despierte a las 8:00 a.m. todos los días, no desea despertarse una hora antes o una hora más tarde después de una transición de horario de verano. Si estoy en la zona horaria del Pacífico de EE. UU., No puedo programar para las 4:00 p.m. UTC, porque después de la transición tendría que cambiar a las 3:00 p.m. UTC para mantener la misma hora local a las 8:00 a.m.

  • Defina la zona horaria que representa la hora "local". No asuma que la zona horaria local del servidor es la misma zona horaria que le importa al usuario final.

  • Proyecte la hora local en una fecha y hora UTC para cada ocurrencia que desee que se active el evento.

    • Casi siempre lo hará para la próxima aparición inmediata, de modo que pueda usar el reloj UTC para determinar el instante real a tiempo para ejecutarse.

    • En algunos casos, es posible que desee proyectar también las próximas varias (o muchas) instancias, como las siguientes 5 ocurrencias, o todas las ocurrencias para el próximo año. (Esta parte es altamente específica para los requisitos de la aplicación).

  • Establezca una estrategia (ya sea fija o configurable) sobre qué hacer en caso de que ocurra en el momento de la transición del horario de verano :

    • Para la transición "hacia adelante", hay una brecha de tiempo local perdido cuando la ocurrencia podría no existir. Por ejemplo, en la hora del Pacífico de EE. UU., Una tarea diaria programada para ejecutarse a las 2:00 a.m., hora local, no existirá el 9 de marzo de 2014. En la mayoría de los casos, querrá adelantar esa hora por la cantidad de ahorro (generalmente 1 hora ), ese día se ejecutará a las 3:00 a.m., pero volverá a funcionar a las 2:00 a.m. en la próxima instancia. (Sin embargo, es muy posible que desee una estrategia diferente para esto).

    • Para la transición "retroceder", hay una superposición de hora local duplicada cuando la ocurrencia puede existir dos veces . Por ejemplo, en la hora del Pacífico de EE. UU., Una tarea diaria programada para ejecutarse a la 1:00 a.m. tendrá dos posibles horas a las que podría ejecutarse el 2 de noviembre de 2014. En la mayoría de los casos, querrá ejecutarse en la primera aparición de 1 : 00 AM PDT y omita la próxima aparición de 1:00 AM PST de la misma fecha. (Pero, de nuevo, es posible que desee una estrategia diferente, como ejecutarse en la segunda aparición o en ambas. YMMV)

  • Esté preparado para volver a calcular todos los tiempos UTC de ocurrencia si alguna vez necesita actualizar los datos de su zona horaria. La IANA / Olson TZDB publica múltiples actualizaciones cada año porque los gobiernos del mundo cambian de opinión todo el tiempo sobre sus compensaciones de zona horaria y las reglas de horario de verano. No puede asumir por un período de tiempo específico en el futuro que las reglas no cambiarán .

    • Asegúrese de suscribirse a los anuncios de lanzamientos de datos de zona horaria, y tenga un proceso para aplicarlos a sus sistemas y / o aplicaciones.

    • En un entorno corporativo tradicional, esto debería ser responsabilidad del personal de operaciones de TI.

    • Dependiendo de su entorno, puede obtener estos datos a través de tzdataactualizaciones de paquetes de Linux, a través de Java JRE o tzupdater , o cualquier otro número de canales. A veces es específico del entorno, y a veces es específico de la plataforma de programación, como el paquete timezonedb PECL para PHP , y muchos otros.

    • Microsoft tiene sus propios datos de zona horaria. En Windows, si está utilizando TimeZoneInfo.NET (por ejemplo), está utilizando estos datos. Las actualizaciones provienen de aquí , y también se envían automáticamente a través de Windows Update, por lo que debe estar atento a ellas para saber cuándo / si necesita recalcular.

  • Con todo esto entendido, no es todavía un escenario donde se programaría simplemente por UTC, y que es para ABSOLUTOS eventos futuros. Ejemplos:

    • Un trabajo que se ejecuta cada X horas o cada X minutos.

    • Hora de inicio y parada del amanecer, u otro fenómeno astronómico.

    • Una ventana de seguridad sensible al tiempo, como cuando se transmite información confidencial a otra parte en un momento previamente acordado.


Programador de tareas de Windows

Windows no necesariamente está haciendo lo correcto. Preste atención a cómo define el desencadenante:

Programador de tareas de Windows

Cuando marca la casilla "Sincronizar a través de zonas horarias", la tarea es programada solo por UTC. (Todas las horas todavía se muestran como hora local, pero se almacenan como UTC). Así que esto es para lo que antes llamé un evento "absoluto".

Cuando deje esa casilla sin marcar, usará la zona horaria local de la computadora en la que se ejecuta el código. No le da ninguna opción para especificar la zona horaria, por lo que no es una muy buena implementación en mi humilde opinión.

No estoy exactamente seguro de su comportamiento DST, pero experimentaré y te responderé al respecto. Probablemente hace lo que describí anteriormente, pero no necesariamente.


Agente SQL

El planificador del Agente SQL es aún peor, ya que solo le permite usar la hora del servidor local. Nuevamente, no se pueden especificar zonas horarias y tampoco se puede especificar UTC.

Ha sido solicitado , pero no aceptado.


En resumen, con las herramientas específicas del Agente SQL y el Programador de tareas de Windows, tiene cambios manuales para hacer cada cambio, ¿verdad? O potencialmente, el código ejecutado desde el programador podría volver a verificar la hora UTC, y luego posiblemente hacer un retraso (en el otoño), pero no hay forma de evitar que el trabajo no se ejecute en la primavera que no sea un cambio manual. ¿O tal vez un guión para reprogramar el horario?
NealWalters

Actualicé la respuesta con información sobre el Programador de tareas de Windows y el Agente SQL. Ninguno de los dos lo está haciendo bien. Si desea desarrollar su propia solución, puede consultar Quartz.net .
Matt Johnson-Pint

A corto plazo, puede usar el Programador de tareas de Windows con esa casilla marcada para definir sus tareas para que se ejecuten en momentos UTC específicos. Pero probablemente querrá que esas sean tareas únicas que construye mediante programación a partir de su propio código para que pueda tener en cuenta el resto.
Matt Johnson-Pint

Otra gran respuesta!
NealWalters

1

Al no preocuparse, en general.

Haga la pregunta "¿y qué si la tarea se ejecuta dos veces?"

En general, no va a importar, por lo que no necesita hacer nada. Si importa, la solución más simple es sacar el trabajo de la hora afectada por el cambio de horario de verano.


Si no me importara, no lo habría preguntado. Algunos importan, otros no. A las 2:00, tenemos trabajos que extraen el archivo y lo envían a nuestros proveedores. No creo que las 2:00 se repitan. Vamos a pasar a las 2:05 solo por un seguro adicional. Tenemos copias de seguridad, trabajos de índice inteligente, etc. pero afortunadamente son posteriores.
NealWalters

1
@NealWalters Creo que es un punto justo, para ser justos con el novato sin esperanza: si no importa si una tarea se ejecuta dos veces, ¿por qué preocuparse? No sé acerca de ti, pero tengo muchas cosas de las que preocuparme, de las que debo preocuparme sin preocuparme por las cosas de las que no tengo que preocuparme. Si se hace la materia, es que ya debe de codificación que hacer algunas comprobaciones cordura de todos modos . Dicho esto, sin duda es una buena idea evitar programar cosas para que se ejecuten en el punto exacto en que los relojes retroceden, eso solo es un problema.
Rob Moir

No es mi elección, enviamos archivos de extracción a los aeropuertos a esa hora de la mañana, y esa es la hora en que quieren el archivo. Estamos utilizando BizTalk, un sistema basado en mensajes, por lo que es más difícil verificar dos veces cosas como esta. Es un poco decepcionante que el programador SQL y el programador de tareas de Windows no permitan una hora UTC diaria.
NealWalters

1

Como notó, la hora entre 1AM y 2AM se repite al final del horario de verano; cuando se produce el cambio inverso (el inicio de DST) los tiempos entre las 2 AM y las 3 AM no ocurrirán (y su trabajo no se ejecutará). Tus mejores opciones van a ser

  • ejecutar el horario de trabajo a UTC
  • ejecutar el trabajo a una hora fuera del cambio (12:59 a.m. o 3 a.m.)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.