Quartz.NET - Verwenden / Verstehen von Cron-basiertem Trigger und Zeitzone / Sommerzeit (Sommerzeit)

Als Beispiel verwenden wir den folgenden Cron-Ausdruck: "0 0 14 1 *?"
-> Feuer am 1. eines jeden Monats um 14:00 Uhr.

Ich habe den Quartz CronScheduleBuilder verwendet, um die Expession zu erstellen, aber das ist irrelevant.

Meine lokale Zeitzone ist UTC + 01: 00 und die Sommerzeit (dieses Jahr) beginnt am 31.03.2013 um 2:00 Uhr, wobei die Zeit auf 3:00 Uhr eingestellt ist.

Wenn ich einen neuen Job mit dem vorgeschlagenen Auslöser am 20.02.2013 einplanen möchte, berechnet Quartz das System.DateTimeOffset für "NextFireTimeUtc" wie folgt:
DateTime: 01.03.2013 13:00:00 (Dies ist die UTC-Zeit, die eine Stunde hinter der lokalen Zeitzone liegt.)
LocalDateTime: 01.03.2013 14:00:00

Der Job wird wie angegeben um 14:00 Uhr korrekt ausgelöst.

Wenn ich nun den Job am 20.03.2013 einplane, ergibt die "NextFireTimeUtc":
DateTime: 01.04.2013 13:00:00 (Dies ist die UTC-Zeit, die jetzt zwei Stunden hinter der lokalen Zeitzone liegt.)
LocalDateTime: 01.04.201315:00:00

Beachten Sie, dass die resultierende NextFireTimeUtc jetzt in die lokale Sommerzeit fällt. Infolgedessen wurde die LocalDateTime auch um eine zusätzliche Stunde von der UTC "korrigiert". Dies führt dazu, dass der Job um 15:00 Uhr ausgeführt wird, was ich nicht möchte.

Was ich (offensichtlich) erwartet habe, ist, dass die "14" im Cron-Ausdruck immer zum Auslösen des Triggers um 14:00 Uhr führen sollte, auch während der Sommerzeit.

Es muss eine einfache Möglichkeit geben, mit diesem Phänomen umzugehen. Ich vermisse wahrscheinlich nur etwas Konzeptionelles. Ich bin verwirrt.

BEARBEITEN:
Das Problem scheint zu sein, dass Quarz das berechnetzuerst NextFireTimeUtc abhängig von deraktuell Informationen zur Zeitzone. Um dies zu testen, habe ich zwei verschiedene Cron-Trigger geplant und GetFireTimeAfter () für den Trigger mit einem zunehmenden Versatz aufgerufen, um die resultierenden Feuerzeiten im Laufe des Jahres anzuzeigen.

Auslöser 1: Feuer am 28. jedes Monats um 14:00 Uhr

GetFireTimeAfter now + 00 months: 28.03.201313:00:00 +00: 00 <- das ist richtig
GetFireTimeNach jetzt + 01 Monaten: 28.04.2013 12:00:00 +00: 00
GetFireTimeNach jetzt + 02 Monaten: 28.05.2013 12:00:00 +00: 00
GetFireTimeNach jetzt + 03 Monaten: 28.06.2013 12:00:00 +00: 00
GetFireTimeNach jetzt + 04 Monaten: 28.07.2013 12:00:00 +00: 00
GetFireTimeNach jetzt + 05 Monaten: 28.08.2013 12:00:00 +00: 00
GetFireTimeNach jetzt + 06 Monaten: 28.09.2013 12:00:00 +00: 00
GetFireTimeAfter now + 07 months: 28.10.2013 13:00:00 +00: 00 <- Die Sommerzeit ist bereits vorbei
GetFireTimeNach jetzt + 08 Monaten: 28.11.2013 13:00:00 +00: 00

Die erste Feuerzeit ist korrekt, da sie noch in die "Winterzeit" fällt. Die Zeiten während der "Sommerzeit" sind um ein zusätzliches -1 versetzt, was zu der korrekten Feuerzeit führt, nachdem die lokale Zeitzone +2 hinzugefügt hat.

Auslöser 1: Feuer am ersten Tag eines jeden Monats um 14:00 Uhr

GetFireTimeAfter now + 00 Monate: 01.04.201313:00:00 +00: 00 <- das ist falsch?
GetFireTimeNach jetzt + 01 Monaten: 01.05.2013 12:00:00 +00: 00
GetFireTimeNach jetzt + 02 Monaten: 01.06.2013 12:00:00 +00: 00
GetFireTimeNach jetzt + 03 Monaten: 01.07.2013 12:00:00 +00: 00
GetFireTimeNach jetzt + 04 Monaten: 01.08.2013 12:00:00 +00: 00
GetFireTimeNach jetzt + 05 Monaten: 01.09.2013 12:00:00 +00: 00
GetFireTimeNach jetzt + 06 Monaten: 01.10.2013 12:00:00 +00: 00
GetFireTimeAfter now + 07 months: 01.11.2013 13:00:00 +00: 00 <- Die Sommerzeit ist bereits vorbei
GetFireTimeNach jetzt + 08 Monaten: 01.12.2013 13:00:00 +00: 00

Das erste Feuer fällt bereits in die Sommerzeit, ist aber nur um -1 versetzt, was zu einer lokalen Auslösezeit von 15:00 führt.

Der Trigger ist also in Ordnung, mit Ausnahme der ersten Triggerzeit, wenn er im Winter geplant ist und die erste Ausführung in den Sommer fällt. Wie geht man damit um?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage