Travaux planifiés pendant les heures de changement d'heure d'automne

12

Je me demande comment les autres gèrent ce scénario.

Que se passe-t-il si votre travail doit s'exécuter à 1 h 30? En automne, lorsque l'heure change, l'heure de 1:00:00 à 1:59:59 se répète et cette tâche s'exécute deux fois.

Peut être le planificateur de tâches Windows, l'agent SQL ou tout autre outil de planification. La plupart de ces outils semblent être basés sur le temps machine et non sur le temps UTC. Si je lui disais d'exécuter le travail à l'heure UTC chaque nuit, je n'aurais pas le problème de l'heure en double.

NealWalters
la source
1
Je n'ai rien trouvé de plus actuel, mais j'espère que cela vous éclairera sur le problème - support.microsoft.com/kb/325413
joeqwerty
C'est excellent, pourquoi ne pas poster une réponse?
NealWalters
Eh bien, cela ne vous donne pas vraiment de solution (du moins pas que je puisse discerner en le lisant), mais j'ai pensé que ce serait utile pour comprendre le problème. Je suis heureux de le laisser en commentaire.
joeqwerty

Réponses:

10

La bonne planification des tâches futures en fonction de l'heure locale, en tenant compte des fuseaux horaires et de l'heure d'été, est un sujet très complexe. J'ai déjà écrit à ce sujet dans une perspective de programmation sur Stack Overflow ici et ici .

Je vais résumer d'un point de vue non-programmation:

  • Définissez vos modèles de récurrence par heure locale - pas UTC . Par exemple, si vous configurez un réveil quotidien pour vous réveiller à 8h00 tous les jours, vous ne voulez pas vous réveiller une heure plus tôt ou une heure plus tard après une transition d'heure d'été. Si je suis dans le fuseau horaire du Pacifique américain, je ne peux pas planifier 16 h 00 UTC, car après la transition, il devra passer à 15 h 00 UTC pour conserver la même heure locale à 8 h 00.

  • Définissez le fuseau horaire représenté par l'heure "locale". Ne présumez pas que le fuseau horaire local du serveur est le même que celui qui compte pour l'utilisateur final.

  • Projetez l'heure locale à une date et une heure UTC pour chaque occurrence à laquelle vous souhaitez que l'événement se déclenche.

    • Vous le ferez presque toujours pour la prochaine occurrence immédiate, de sorte que vous pouvez utiliser l'horloge UTC pour déterminer l'instant réel à exécuter.

    • Dans certains cas, vous pouvez également projeter les plusieurs (ou plusieurs) instances suivantes, telles que les 5 prochaines occurrences, ou toutes les occurrences de l'année suivante. (Cette partie est très spécifique aux exigences de l'application.)

  • Avoir une stratégie (fixe ou configurable), de ce qu'il faut faire pour les événements qui tombent au moment d'une transition d' heure d'été :

    • Pour la transition "printemps vers l'avant", il y a un manque d'heure locale manquante lorsque l'occurrence pourrait ne pas exister. Par exemple, dans l'heure du Pacifique américain, une tâche quotidienne planifiée pour s'exécuter à 2 h 00, heure locale, n'existera pas le 9 mars 2014. Dans la plupart des cas, vous souhaiterez avancer cette heure de la quantité économisée (généralement 1 heure ), donc ce jour-là, il s'exécutera à 3 h 00, mais sera de nouveau exécuté à 2 h 00 dans l'instance suivante. (Cependant, il est tout à fait possible que vous souhaitiez une stratégie différente pour cela.)

    • Pour la transition "repli", il y a un chevauchement de l'heure locale en double lorsque l'occurrence peut exister deux fois . Par exemple, dans l'heure du Pacifique américain, une tâche quotidienne planifiée pour s'exécuter à 1 h 00 aura deux heures possibles d'exécution le 2 novembre 2014. Dans la plupart des cas, vous voudrez l'exécuter à la première occurrence de 1 : 00 AM PDT et ignorez la prochaine occurrence de 1:00 AM PST de la même date. (Mais encore une fois, vous souhaiterez peut - être une stratégie différente, telle que l'exécution sur la deuxième occurrence, ou l'exécution dans les deux. YMMV)

  • Soyez prêt à recalculer toutes vos heures UTC d'occurrence si vous avez besoin de mettre à jour vos données de fuseau horaire. L' IANA / Olson TZDB publie plusieurs mises à jour chaque année parce que les gouvernements du monde changent constamment d' avis sur les décalages de fuseau horaire et les règles d'heure d'été. Vous ne pouvez pas supposer pour une durée spécifique à l'avenir que les règles ne changeront pas .

    • Assurez-vous de vous abonner aux annonces de publication des données de fuseau horaire et d'avoir un processus pour les appliquer à vos systèmes et / ou applications.

    • Dans un cadre d'entreprise traditionnel, cette responsabilité devrait incomber au personnel des opérations informatiques.

    • Selon votre environnement, vous pouvez obtenir ces données via tzdatales mises à jour de packages linux, via Java JRE ou tzupdater , ou n'importe quel nombre d'autres canaux. Parfois, il est spécifique à l'environnement et parfois à la plate-forme de programmation, comme le package PECL timezonedb pour PHP , et bien d'autres.

    • Microsoft a ses propres données de fuseau horaire. Sous Windows, si vous utilisez à TimeZoneInfopartir de .NET (par exemple), vous utilisez ces données. Les mises à jour viennent d' ici et sont également diffusées automatiquement via Windows Update, vous devez donc garder un œil sur celles-ci afin de savoir quand / si vous devez recalculer.

  • Avec tout cela compris, il y a encore un scénario où vous planifieriez uniquement par UTC, et c'est pour les événements futurs ABSOLUS . Exemples:

    • Un travail qui s'exécute toutes les X heures ou toutes les X minutes.

    • Heures de début et de fin du lever du soleil, ou autre phénomène astronomique.

    • Une fenêtre de sécurité sensible au temps, comme lors de la transmission d'informations sensibles à une autre partie à un moment prédéterminé.


Planificateur de tâches Windows

Windows ne fait pas nécessairement la bonne chose. Faites attention à la façon dont vous définissez le déclencheur:

Planificateur de tâches Windows

Lorsque vous cochez la case intitulée "Synchroniser entre les fuseaux horaires", la tâche est planifiée par UTC uniquement. (Toutes les heures sont toujours affichées comme heure locale, mais sont stockées en UTC.) C'est donc pour ce que j'ai appelé plus tôt un événement "absolu".

Lorsque vous laissez cette case décochée, elle va utiliser le fuseau horaire local de l'ordinateur sur lequel le code s'exécute. Il ne vous donne aucune option pour spécifier le fuseau horaire, donc ce n'est pas une très bonne implémentation à mon humble avis.

Je ne suis pas exactement sûr de son comportement DST, mais je vais expérimenter et vous revenir là-dessus. Il fait probablement ce que j'ai décrit ci-dessus, mais pas nécessairement.


Agent SQL

Le planificateur SQL Agent est encore pire, dans la mesure où il vous permet uniquement d'utiliser l'heure du serveur local. Encore une fois, aucun fuseau horaire ne peut être spécifié et vous ne pouvez pas non plus spécifier UTC.

Il a été demandé , mais pas accepté.

Matt Johnson-Pint
la source
Donc, en fin de compte, avec les outils spécifiques de l'Agent SQL et du Planificateur de tâches Windows, vous avez des changements manuels à effectuer à chaque changement, non? Ou potentiellement, le code exécuté à partir du planificateur pourrait revérifier l'heure UTC, puis éventuellement retarder (à l'automne), mais aucun moyen d'éviter que le travail ne s'exécute au printemps autre qu'une modification manuelle. Ou, peut-être un script pour reprogrammer réellement le programme?
NealWalters
J'ai mis à jour la réponse avec des informations sur le Planificateur de tâches Windows et l'Agent SQL. Ni le faire correctement. Si vous souhaitez développer votre propre solution, vous pouvez consulter Quartz.net .
Matt Johnson-Pint
À court terme, vous pouvez utiliser le Planificateur de tâches Windows avec cette case cochée pour définir vos tâches à exécuter à des heures UTC spécifiques. Mais vous voudrez probablement que ce soient des tâches ponctuelles que vous créez par programme à partir de votre propre code afin que vous puissiez prendre le reste en considération.
Matt Johnson-Pint
Une autre excellente réponse!
NealWalters
1

En ne se souciant pas, généralement.

Posez la question "et si la tâche s'exécute deux fois?"

En général, cela n'a pas d'importance, vous n'avez donc rien à faire. Si cela importait, la solution la plus simple consiste à déplacer le travail hors de l'heure affectée par le changement d'heure d'été.

HopelessN00b
la source
Si je m'en fichais, je n'aurais pas demandé. Certains comptent, d'autres non. À 2h00, nous avons des travaux qui extraient le fichier et l'envoient à nos fournisseurs. Je ne pense pas que 2h00 se répétera. Nous allons passer à 2 h 05 uniquement pour une assurance supplémentaire. Nous avons des sauvegardes, des travaux d'index intelligent, etc ... mais heureusement, ils sont plus tard.
NealWalters
1
@NealWalters Je pense que c'est un bon point, pour être juste envers hopelessnoob: Si cela n'a pas d' importance si une tâche s'exécute deux fois, alors pourquoi s'inquiéter. Je ne sais pas pour vous mais j'ai beaucoup de choses à craindre à la place qui doivent être inquiètes sans se soucier des choses dont je n'ai pas besoin de m'inquiéter. Si elle ne importe alors vous devriez coder déjà faire quelques vérifications de santé mentale de toute façon . Cela dit, c'est certainement une bonne idée d'éviter de planifier des choses pour qu'elles s'exécutent au point exact où les horloges remontent - c'est juste un problème.
Rob Moir
Ce n'est pas mon choix, nous envoyons des fichiers d'extrait aux aéroports à cette heure du matin, et c'est à ce moment-là qu'ils veulent le fichier. Nous utilisons BizTalk, un système basé sur les messages, donc plus difficile à vérifier pour des choses comme ça. Il est un peu décevant que le planificateur SQL et le planificateur de tâches Windows n'autorisent pas l'heure UTC quotidienne.
NealWalters
1

Comme vous l'avez noté, l'heure entre 1 h et 2 h se répète à la fin de l'heure d'été; lorsque le changement inverse se produit (le début de l'heure d'été), les heures entre 2 h et 3 h ne se produisent pas (et votre travail ne s'exécute pas). Vos meilleures options vont être

  • exécuter le calendrier des travaux en UTC
  • exécuter le travail à un moment en dehors du basculement (00 h 59 ou 3 h 00)
Andrew
la source