Ich frage mich, wie andere mit diesem Szenario umgehen.
Was ist, wenn Sie einen Job haben, der um 1:30 Uhr ausgeführt werden soll? Im Herbst, wenn sich die Zeit ändert, wiederholt sich die Stunde von 1:00:00 bis 1:59:59, sodass der Job zweimal ausgeführt wird.
Dies kann Windows Task Scheduler, SQL Agent oder ein anderes Planungstool sein. Die meisten dieser Tools basieren anscheinend auf der Maschinenzeit und nicht auf der UTC-Zeit. Wenn ich anweisen würde, den Job jede Nacht um UTC-Zeit auszuführen, hätte ich kein Problem mit der doppelten Stunde.
scheduled-task
task-scheduler
job-scheduler
sql-server
NealWalters
quelle
quelle
Antworten:
Die richtige Planung zukünftiger Aufgaben nach Ortszeit unter Berücksichtigung von Zeitzonen und Sommerzeit ist ein sehr komplexes Thema. Ich habe hier und hier bereits aus Programmiersicht über Stack Overflow darüber geschrieben .
Ich werde aus einer nicht programmierbaren Perspektive zusammenfassen:
Definieren Sie Ihre Wiederholungsmuster nach Ortszeit - nicht nach UTC . Wenn Sie beispielsweise einen täglichen Wecker einstellen, der Sie jeden Tag um 8:00 Uhr aufweckt, möchten Sie nach einer Sommerzeitumstellung nicht eine Stunde früher oder eine Stunde später aufwecken. Wenn ich mich in der US-Pazifik-Zeitzone befinde, kann ich keinen Zeitplan für 16.00 Uhr UTC erstellen, da nach der Umstellung auf 15.00 Uhr UTC umgestellt werden muss, um die Ortszeit von 8.00 Uhr zu halten.
Definieren Sie die Zeitzone, die die "lokale" Zeit darstellt. Nehmen Sie nicht an, dass die lokale Zeitzone des Servers dieselbe Zeitzone ist, die für den Endbenutzer von Bedeutung ist.
Projizieren Sie die Ortszeit auf ein UTC-Datum und eine UTC-Zeit für jedes Ereignis, das das Ereignis auslösen soll.
Sie werden dies fast immer für das nächste unmittelbare Ereignis tun, sodass Sie die UTC-Uhr verwenden können, um den tatsächlichen Ausführungszeitpunkt zu bestimmen.
In einigen Fällen möchten Sie möglicherweise auch die nächsten (oder mehrere) Instanzen projizieren, z. B. die nächsten 5 Vorkommen oder alle Vorkommen für das nächste Jahr. (Dieser Teil ist sehr spezifisch für die Anforderungen der Anwendung.)
Verfügen Sie über eine Strategie (entweder fest oder konfigurierbar) für Vorkommnisse, die zum Zeitpunkt eines Übergangs zwischen Sommer- und Winterzeit auftreten:
Für den Übergang "Vorwärtsspringen" gibt es eine Lücke, in der die Ortszeit fehlt, wenn das Ereignis möglicherweise nicht vorhanden ist. In der US-Pazifik-Zeit beispielsweise ist eine tägliche Aufgabe, die um 2:00 Uhr Ortszeit ausgeführt werden soll, am 9. März 2014 nicht vorhanden. In den meisten Fällen möchten Sie diese Zeit um den gesparten Betrag vorverlegen (normalerweise 1 Stunde) ), an diesem Tag wird es um 3:00 Uhr morgens ausgeführt, in der nächsten Instanz wird es jedoch wieder um 2:00 Uhr morgens ausgeführt. (Es ist jedoch durchaus möglich, dass Sie hierfür eine andere Strategie wünschen.)
Für den "Fallback" -Übergang gibt es eine Überlappung der duplizierten Ortszeit, wenn das Vorkommen möglicherweise zweimal vorhanden ist . In der US-Pazifik-Zeit kann ein täglicher Task, der um 01:00 Uhr ausgeführt werden soll, am 2. November 2014 zu zwei möglichen Zeitpunkten ausgeführt werden. In den meisten Fällen möchten Sie ihn beim ersten Auftreten von 1 ausführen : 00 PDT und überspringen Sie das nächste Auftreten von 1:00 PST des gleichen Datums. ( Möglicherweise möchten Sie aber auch eine andere Strategie, z. B. beim zweiten Auftreten oder in beiden. YMMV)
Bereiten Sie sich darauf vor, alle UTC-Zeiten Ihres Auftretens neu zu berechnen, wenn Sie jemals Ihre Zeitzonendaten aktualisieren müssen. Die IANA / Olson TZDB veröffentlicht jedes Jahr mehrere Updates, da die Regierungen der Welt ihre Meinung zu Zeitzonenverschiebungen und Sommerzeitregeln ständig ändern. Sie können nicht für einen bestimmten Zeitraum in der Zukunft davon ausgehen, dass sich die Regeln nicht ändern .
Stellen Sie sicher, dass Sie Ankündigungen von Zeitzonendaten-Releases abonnieren und über ein Verfahren verfügen, um sie auf Ihre Systeme und / oder Anwendungen anzuwenden.
In einem traditionellen Unternehmensumfeld sollte dies in der Verantwortung des IT-Betriebspersonals liegen.
Abhängig von Ihrer Umgebung erhalten Sie diese Daten möglicherweise über
tzdata
Linux-Paketaktualisierungen, über Java JRE oder tzupdater oder über eine beliebige Anzahl anderer Kanäle. Manchmal ist es umgebungsspezifisch und manchmal ist es plattformspezifisch, wie das PECL-Paket timezonedb für PHP und viele andere.Microsoft hat seine eigenen Zeitzonendaten. Wenn Sie unter Windows
TimeZoneInfo
beispielsweise .NET verwenden, verwenden Sie diese Daten. Updates kommen von hier und werden auch automatisch über Windows Update verteilt. Achten Sie daher auf diese, damit Sie wissen, wann bzw. ob Sie eine Neuberechnung durchführen müssen.Wenn all dies verstanden ist, gibt es immer noch ein Szenario, in dem Sie nur nach UTC planen würden, und zwar für ABSOLUTE zukünftige Ereignisse. Beispiele:
Ein Job, der alle X Stunden oder alle X Minuten ausgeführt wird.
Start- und Stoppzeiten des Sonnenaufgangs oder andere astronomische Phänomene.
Ein zeitkritisches Sicherheitsfenster, z. B. beim Übertragen vertraulicher Informationen an eine andere Partei zu einem festgelegten Zeitpunkt.
Windows-Taskplaner
Windows tut nicht unbedingt das Richtige. Achten Sie darauf, wie Sie den Auslöser definieren:
Wenn Sie das Kontrollkästchen "Über Zeitzonen hinweg synchronisieren" aktivieren, wird die Aufgabe nur von UTC geplant. (Alle Zeiten werden immer noch als Ortszeit angezeigt, aber als UTC gespeichert .) Dies ist also für das, was ich früher als "absolutes" Ereignis bezeichnet habe.
Wenn Sie dieses Kontrollkästchen nicht aktivieren, wird die lokale Zeitzone des Computers verwendet, auf dem der Code ausgeführt wird. Sie haben keine Möglichkeit, die Zeitzone anzugeben, daher ist dies meiner Meinung nach keine sehr gute Implementierung.
Ich bin mir nicht ganz sicher, ob es sich um eine Sommerzeit handelt, aber ich werde experimentieren und darauf zurückkommen. Es macht wahrscheinlich das, was ich oben beschrieben habe, aber nicht unbedingt.
SQL Agent
Der SQL Agent-Scheduler ist sogar noch schlimmer, da Sie nur die lokale Serverzeit verwenden können. Auch hier können keine Zeitzonen angegeben werden, und Sie können auch keine UTC-Zeit angeben.
Es wurde angefordert , aber nicht akzeptiert.
quelle
Indem man sich im Allgemeinen nicht darum kümmert.
Stellen Sie die Frage "Was ist, wenn die Aufgabe zweimal ausgeführt wird?"
Im Allgemeinen spielt es keine Rolle, Sie müssen also nichts unternehmen. Wenn es darauf ankommt, ist die einfachste Lösung, den Job außerhalb der von der Sommerzeitumstellung betroffenen Stunde zu verschieben.
quelle
Wie Sie bereits bemerkt haben, wird die Stunde zwischen 1:00 und 02:00 Uhr am Ende der Sommerzeit wiederholt. Wenn die umgekehrte Änderung auftritt (der Start der Sommerzeit), werden die Zeiten zwischen 2 Uhr morgens und 3 Uhr morgens nicht auftreten (und Ihr Job wird nicht ausgeführt). Ihre besten Optionen werden sein
quelle