5

この質問はこれに関連してますが、より一般的なものであり、個別に扱うことができます。

編集: Quartz のバージョンは v2.0.1 です

私の理解では、次の単体テストに合格する必要があります。

[Test]
public void Test() {
    // run every first day of month at 14:00 hours
    CronExpression expression = new CronExpression("0 0 14 1 * ?");

    //  TimeZoneInfo.Local = {(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien}
    if (!TimeZoneInfo.Local.SupportsDaylightSavingTime) {
        return;
    }

    // get "summertime" period for current timezone
    var daylightChange = TimeZone.CurrentTimeZone.GetDaylightChanges(2013);
    //  -> daylightChange.Start     {31.03.2013 02:00:00}   System.DateTime
    //  -> daylightChange.End       {27.10.2013 03:00:00}   System.DateTime

    // get one startpoint before and one after begin of summertime
    DateTimeOffset beforeSummertime = daylightChange.Start.ToUniversalTime().AddDays(-1);
    DateTimeOffset afterSummertime = daylightChange.Start.ToUniversalTime().AddDays(1);
    // -> beforeSummertime  {30.03.2013 01:00:00 +00:00}    System.DateTimeOffset
    // -> afterSummertime   {01.04.2013 01:00:00 +00:00}    System.DateTimeOffset

    DateTimeOffset? nextValidTimeFromBefore = expression.GetNextValidTimeAfter(beforeSummertime);
    DateTimeOffset? nextValidTimeFromAfter = expression.GetNextValidTimeAfter(afterSummertime);
    // nextValidTimeFromBefore  {01.04.2013 13:00:00 +00:00}    System.DateTimeOffset?
    // nextValidTimeFromAfter   {01.04.2013 12:00:00 +00:00}    System.DateTimeOffset?

    Assert.AreEqual(nextValidTimeFromBefore, nextValidTimeFromAfter);
}  

ただし (ご覧のとおり)、 は とはnextValidTimeFromBefore異なりnextValidTimeFromAfterます。の結果nextValidTimeFromAfterは正しいです。UTC 12:00 は、夏時間の 14:00 になります (この時点ですでに開始されています)。GetNextValidTimeAfter()パラメーターが夏時間内または夏時間外の時間を指定するかどうかは問題ではありません。

NextValidTimes を等しくする必要がありますか、それとも私のアプローチに欠陥がありますか?

4

1 に答える 1

8

これは実際には Quartz.NET 2.0.1 のバグであることがわかりましたが、2.1.0 では既に修正されています。

サイトの変更ログを確認しましたが、関連する修正については言及されていません。Peter Ritchie からのコメントは、新しい Quartz バージョンをもう一度見てみるきっかけになりました。リポジトリのコミットを調べたところ、実際にこれに対する修正があることに気付きました。

リビジョン 665 で修正されました。


CronExpression、calendar、CalendarIntervalTriggerImpl での、amazing-andrew/master タイム ゾーンの問題からのプル リクエスト #72 のマージ

この修正を含む最初の公式リリースは v2.1.0 で、リビジョン 685 でタグ付けされています。

バグは次の場所にありましたCronExpression.GetTimeAfter()(これは によって呼び出されCronExpression.GetNextValidTimeAfter()ます):

...
d = new DateTimeOffset(year, d.Month, d.Day, d.Hour, d.Minute, d.Second, d.Offset);

// apply the proper offset for this date (this wasn't there)
d = new DateTimeOffset(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second, this.TimeZone.GetUtcOffset(d.DateTime));
...
于 2013-03-28T18:22:29.257 に答える