Zaplanowane zadania w godzinach jesiennej zmiany czasu


12

Zastanawiam się, jak inni ludzie radzą sobie z tym scenariuszem.

Co jeśli masz zaplanowane zadanie o 1:30. Jesienią, gdy czas się zmienia, godzina od 1:00:00 do 1:59:59 powtarza się, aby zadanie działało dwukrotnie.

Może to być Windows Task Scheduler, SQL Agent lub dowolne inne narzędzie do planowania. Większość tych narzędzi wydaje się opierać na czasie maszyny, a nie czasie UTC. Gdybym kazał mu uruchamiać zadanie o godzinie UTC każdej nocy, nie miałbym problemu z duplikatem godziny.


1
Nie mogłem znaleźć nic bardziej aktualnego, ale mam nadzieję, że
rzuci

To świetnie, dlaczego nie opublikować odpowiedzi?
NealWalters

Cóż, tak naprawdę nie daje ci rozwiązania (przynajmniej nie, żebym mógł je rozpoznać), ale pomyślałem, że to pomoże w zrozumieniu problemu. Z przyjemnością zostawiam to jako komentarz.
joeqwerty

Odpowiedzi:


10

Właściwe planowanie przyszłych zadań według czasu lokalnego, z uwzględnieniem stref czasowych i czasu letniego, jest bardzo złożonym tematem. Pisałem o tym wcześniej z perspektywy programowej na Stack Overflow tu i tutaj .

Podsumuję z perspektywy nieprogramowej:

  • Zdefiniuj wzorce nawrotów według czasu lokalnego - nie UTC . Na przykład, jeśli ustawisz codzienny budzik, aby budził cię codziennie o 8:00 rano, nie chcesz budzić się godzinę wcześniej ani godzinę później po zmianie czasu na letni. Jeśli jestem w strefie czasowej USA Pacyfiku, nie mogę zaplanować godziny 16:00 UTC, ponieważ po przejściu musiałby przełączyć się na godzinę 15:00 UTC, aby zachować ten sam czas lokalny o godzinie 8:00.

  • Zdefiniuj strefę czasową reprezentowaną przez czas „lokalny”. Nie zakładaj, że lokalna strefa czasowa serwera jest tą samą strefą czasową, która ma znaczenie dla użytkownika końcowego.

  • Wyświetl czas lokalny na datę i godzinę UTC dla każdego zdarzenia, w którym ma zostać uruchomione zdarzenie.

    • Prawie zawsze zrobisz to dla następnego natychmiastowego wystąpienia, na przykład możesz użyć zegara UTC, aby określić rzeczywistą natychmiastową godzinę uruchomienia.

    • W niektórych przypadkach możesz także chcieć wyświetlić kilka kolejnych (lub wielu) wystąpień, takich jak 5 kolejnych wystąpień lub wszystkie wystąpienia na następny rok. (Ta część jest bardzo specyficzna dla wymagań aplikacji.)

  • Przygotuj strategię (stałą lub konfigurowalną) określającą, co zrobić w przypadku zdarzeń, które wypadają w czasie zmiany czasu na letni :

    • W przypadku przejścia „wiosennego do przodu” występuje brak czasu lokalnego, gdy wystąpienie może nie istnieć. Na przykład w czasie pacyficznym w USA codzienne zadanie zaplanowane na godzinę 2:00 czasu lokalnego nie będzie istniało 9 marca 2014 r. W większości przypadków będziesz chciał przyspieszyć ten czas o kwotę oszczędności (zwykle 1 godzinę ), więc tego dnia uruchomi się o 3:00, ale w następnym przypadku powróci do działania o 2:00. (Jest jednak całkiem możliwe, że będziesz potrzebować innej strategii.)

    • W przypadku przejścia „rezerwowego” zachodzi na siebie powielony czas lokalny, gdy zdarzenie może występować dwukrotnie . Na przykład w czasie pacyficznym w USA codzienne zadanie zaplanowane na godzinę 1:00 będzie miało dwa możliwe czasy, które mogłoby zostać uruchomione 2 listopada 2014 r. W większości przypadków będzie ono uruchamiane przy pierwszym wystąpieniu 1 : 00 AM PDT i pomiń następne wystąpienie 1:00 PST tego samego dnia. (Ale znowu, może chcieć inną strategię, jak działa na drugim wystąpieniu, czy działa w obu. YMMV)

  • Przygotuj się na ponowne obliczenie wszystkich czasów UTC wystąpienia, jeśli kiedykolwiek będziesz potrzebować zaktualizować dane strefy czasowej. W IANA / Olson TZDB gasi wielu aktualizacji rocznie, ponieważ rządy zmiany ich umysły świata cały czas o ich przesunięcia strefy czasowej i zasad dotyczących czasu letniego. Nie można zakładać przez określony czas w przyszłości, że zasady się nie zmienią .

    • Pamiętaj, aby zasubskrybować ogłoszenia o wydaniach danych stref czasowych i mieć proces ich stosowania w systemach i / lub aplikacjach.

    • W tradycyjnym otoczeniu korporacyjnym powinien to być obowiązek personelu działu IT.

    • W zależności od środowiska możesz uzyskiwać te dane poprzez tzdataaktualizacje pakietu Linux, JRE Java lub tzupdater lub dowolną liczbę innych kanałów. Czasami zależy od środowiska, a czasem od platformy programistycznej, takiej jak pakiet PECL timzonedb dla PHP i wiele innych.

    • Microsoft ma własne dane strefy czasowej. W systemie Windows, jeśli korzystasz TimeZoneInfoz .NET (na przykład), używasz tych danych. Aktualizacje pochodzą stąd , a także są automatycznie wypychane przez Windows Update, więc powinieneś uważać na te, abyś wiedział, kiedy / jeśli chcesz przeliczyć.

  • Z tego wszystkiego rozumieć, nie jest jeszcze scenariusz, w którym chcesz zaplanować tylko przez UTC, a to jest dla BEZWZGLĘDNYCH zdarzeń przyszłych. Przykłady:

    • Zadanie uruchamiane co X godzin lub co X minut.

    • Czas rozpoczęcia i zakończenia wschodu słońca lub inne zjawisko astronomiczne.

    • Okno bezpieczeństwa wrażliwe na czas, na przykład podczas przesyłania poufnych informacji innej stronie w ustalonym czasie.


Harmonogram zadań systemu Windows

Windows niekoniecznie postępuje właściwie. Zwróć uwagę na sposób definiowania wyzwalacza:

Harmonogram zadań systemu Windows

Po zaznaczeniu pola „Synchronizuj w różnych strefach czasowych” zadanie jest planowane tylko przez UTC. (Wszystkie czasy są nadal wyświetlane jako czas lokalny, ale są przechowywane jako UTC.) To dlatego, jak wcześniej nazwałem, zdarzeniem „absolutnym”.

Jeśli pozostawisz to pole niezaznaczone, użyje lokalnej strefy czasowej komputera, na którym działa kod. Nie daje żadnej opcji określania strefy czasowej, więc nie jest to bardzo dobra implementacja IMHO.

Nie jestem do końca pewien, czy jest to zachowanie DST, ale poeksperymentuję i skontaktuję się z Tobą. Prawdopodobnie robi to, co opisałem powyżej, ale niekoniecznie.


Agent SQL

Program planujący agenta SQL jest jeszcze gorszy, ponieważ pozwala tylko na użycie czasu lokalnego serwera. Ponownie nie można określić żadnych stref czasowych i nie można również podać UTC.

Zostało ono wymagane , ale nie są akceptowane.


Tak więc, dzięki konkretnym narzędziom SQL Agent i Windows Task Scheduler, masz ręczne zmiany, które należy wprowadzać za każdym razem, prawda? Lub potencjalnie kod uruchamiany z harmonogramu może ponownie sprawdzić czas UTC, a następnie może opóźnić (jesienią), ale nie ma sposobu, aby uniknąć uruchomienia zadania na wiosnę poza ręczną zmianą. A może skrypt do przeprogramowania harmonogramu?
NealWalters

Zaktualizowałem odpowiedź informacjami o Windows Task Scheduler i SQL Agent. Ani też nie robią tego dobrze. Jeśli chcesz opracować własne rozwiązanie, możesz zajrzeć na stronę Quartz.net .
Matt Johnson-Pint,

W krótkim okresie można użyć Harmonogramu zadań systemu Windows z zaznaczonym tym polem, aby zdefiniować zadania do uruchomienia w określonych godzinach UTC. Ale prawdopodobnie będziesz chciał, aby były to jednorazowe zadania, które budujesz programowo z własnego kodu, abyś mógł wziąć pod uwagę resztę.
Matt Johnson-Pint,

Kolejna świetna odpowiedź!
NealWalters

1

Na ogół nie troszcząc się.

Zadaj pytanie „a co jeśli zadanie uruchomi się dwukrotnie?”

Zasadniczo nie będzie to miało znaczenia, więc nie musisz nic robić. Jeśli miałoby to znaczenie, najprostszym rozwiązaniem jest przeniesienie pracy poza godzinę, na którą wpływa zmiana czasu letniego.


Gdyby mnie to nie obchodziło, nie zapytałbym. Niektóre mają znaczenie, niektóre nie. O 2:00 mamy zadania, które wyodrębniają plik i wysyłają go do naszych dostawców. Nie sądzę, żeby 2:00 się powtórzyło. Przejdziemy do 2:05 tylko dla dodatkowego ubezpieczenia. Mamy kopie zapasowe, inteligentne zadania indeksowe itp., Ale na szczęście są później.
NealWalters

1
@NealWalters Myślę, że to słuszna kwestia, aby być sprawiedliwym wobec beznadziejnego: Jeśli nie ma znaczenia, czy zadanie uruchomi się dwukrotnie, to po co się martwić. Nie wiem o tobie, ale mam mnóstwo rzeczy do zmartwienia, o które trzeba się martwić, nie martwiąc się o rzeczy, o które nie muszę się martwić. Jeśli to nie kwestia to należy już do kodowania to zrobić sprawdzania czystości w każdym razie . To powiedziawszy, z pewnością dobrym pomysłem jest unikanie planowania rzeczy, które mają działać dokładnie w punkcie, w którym cofają się zegary - to po prostu proszenie o kłopoty.
Rob Moir,

To nie jest mój wybór, wysyłamy wyodrębnione pliki na lotniska o tej porze rano i właśnie wtedy chcą tego pliku. Używamy BizTalk, systemu opartego na wiadomościach, dlatego trudniej jest dwukrotnie sprawdzić takie rzeczy. To trochę rozczarowujące, że harmonogram SQL i harmonogram zadań Windows nie pozwalają na codzienny czas UTC.
NealWalters

1

Jak zauważyłeś, godzina między 1 w nocy a 2 w nocy powtarza się pod koniec czasu letniego; kiedy nastąpi odwrotna zmiana (początek czasu letniego), czasy między 2:00 a 3:00 nie wystąpią (a twoje zadanie nie uruchomi się). Twoje najlepsze opcje będą

  • uruchom harmonogram zadań do UTC
  • uruchom zadanie w czasie poza zmianą (12:59 lub 3 w nocy)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.