例として、次のcron式を使用します: "0 0 14 1 *?"
->毎月1日の14:00に発砲します。
Quartz CronScheduleBuilderを使用してエクスプレッションを作成しましたが、これは関係ありません。
私のローカルタイムゾーンはUTC+01:00で、夏時間(今年)は2013年3月31日2:00に始まり、時刻は3:00に調整されます。
たとえば20.02.2013に提案されたトリガーを使用して新しいジョブをスケジュールすると、Quartzは「NextFireTimeUtc」のSystem.DateTimeOffsetを次のように正しく計算します。DateTime
:01.03.2013 13:00:00(これは、UTC時間です。ローカルタイムゾーンから1時間遅れています)
LocalDateTime:01.03.2013 14:00:00
指定されたように、ジョブは14:00に正しくトリガーされます。
2013年3月20日にジョブをスケジュールすると、「NextFireTimeUtc」の結果は次のようになり
ます。DateTime:01.04.2013 13:00:00(これはUTC時間であり、ローカルタイムゾーンより2時間遅れています)
LocalDateTime:01.04.2013 15:00:00
結果のNextFireTimeUtcがローカルの夏時間内に収まることに注意してください。その結果、LocalDateTimeもUTCからさらに1時間「修正」されました。これにより、ジョブは15:00に実行されますが、これは私が望んでいることではありません。
私が(明らかに)期待したことは、cron式の「14」は、夏の間であっても、常に14:00にトリガーを起動する必要があるということです。
この現象に対処する簡単な方法があるはずです、私はおそらく概念的な何かを見逃しているだけです。私は混乱しています。
編集:
問題は、Quartzが現在のタイムゾーン情報に応じて最初のNextFireTimeUtcを計算することであるようです。これをテストするために、2つの異なるcronトリガーをスケジュールし、トリガーに対してGetFireTimeAfter()を呼び出し、オフセットを増やして、1年間の結果の起動時間を表示しました。
トリガー1:毎月28日の14:00に発砲します。
GetFireTimeAfter now + 00ヶ月:28.03.2013 13:00:00 +00:00 <-これは正しい
GetFireTimeAfternow + 01ヶ月:28.04.2013 12:00:00 +00:00
GetFireTimeAfter now + 02ヶ月:28.05.2013 12:00:00 +00:00
GetFireTimeAfter now + 03か月:28.06.2013 12:00:00 +00:00
GetFireTimeAfter now + 04か月:28.07.2013 12:00:00 +00:00
GetFireTimeAfter now+05か月:28.08.2013 12:00:00 +00:00
GetFireTimeAfter now + 06か月:28.09.2013 12:00:00 +00:00
GetFireTimeAfter now + 07か月:28.10.2013 13:00:00 +00:00 < -サマータイムはすでに終了してい
ますGetFireTimeAfternow+ 08months:28.11.2013 13:00:00 +00:00
最初の発砲時間はまだ「冬時間」に該当するため、正しいです。「夏」の時間はさらに-1だけずれており、ローカルタイムゾーンが+2を追加した後、正しい発砲時間が発生します。
トリガー1:毎月1日の14:00に発砲します。
GetFireTimeAfter now + 00months:01.04.2013 13:00:00 +00:00 <-これは間違っていますか?
GetFireTimeAfter now + 01か月:01.05.2013 12:00:00 +00:00
GetFireTimeAfter now + 02か月:01.06.2013 12:00:00 +00:00
GetFireTimeAfter now + 03か月:01.07.2013 12:00:00 +00:00
GetFireTimeAfter now + 04か月:01.08.2013 12:00:00 +00:00
GetFireTimeAfter now + 05か月:01.09.2013 12:00:00 +00:00
GetFireTimeAfter now + 06か月:01.10.2013 12 :00:00 +00:00
GetFireTimeAfter now + 07か月:01.11.2013 13:00:00 +00:00<-サマータイムはすでに終了してい
ますGetFireTimeAfternow + 08か月:01.12.2013 13:00:00 +00:00
最初の火災はすでに夏季に発生しますが、-1だけ相殺され、ローカルトリガー時間は15:00になります。
したがって、トリガーは、最初のトリガー時刻を除いて、冬季にスケジュールされ、最初の実行が夏季内にある場合は問題ありません。これをどのように処理しますか?