2013-03-28 9 views
5

この質問はthis oneに関連していますが、より一般的に保たれ、独立して扱うことができます。Quartz.NET - このユニットテストは合格しませんか?

EDIT:クォーツバージョンは私の理解から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); 
} 

しかし(あなたが見ることができるように)、nextValidTimeFromBeforenextValidTimeFromAfterとは異なります。 nextValidTimeFromAfterの結果は正しいです。 UTC 12:00は夏期(すでにその時点で開始)の14:00になります。 GetNextValidTimeAfter()パラメータでサマータイム期間の内側または外側の時間を指定しても問題ありません。

NextValidTimesが等しいか、私のアプローチに欠陥がありますか?

+1

これは私のために罰金渡す(私はあなたのTZではないよ)と私はちょうどあなたが、詳細ました開始日と終了日と新しい 'DaylightTime'オブジェクトを作成した場合(例えば、 'daylightChange =新しいDaylightTime(新しいDateTime(2013,3,3,1,2,0,0)、新しいDateTime(2013、10,27,2,0,0)、TimeSpan.MinValue)')も通過します。 –

+0

これは私に新しいQuartzバージョンをもう一度見てもらうよう奨励しました。私はすでにサイトの変更ログを確認しましたが、これには関連する修正はありません。しかし、私がリポジトリ内のコミットを見たとき、私はそこに気づいたが、実際にはこれが修正されていた。私は詳細な情報の回答を追加します。 –

+0

私はこれを2.1.2.400、FWIWで試しました –

答えて

8

これは実際にはQuartz.NET 2.0.1のバグですが、2.1.0ではすでに修正されています。

サイトの変更ログを確認しましたが、関連する修正は記載されていません。 Peter Ritchieのコメントは、私が新しいQuartzのバージョンをもう一度見直すよう奨励しました。私がリポジトリ内のコミットを見たとき、私はそこに気づいたが、実際にはこれが修正されていた。

それはリビジョン665に固定されていますから

マージプル要求#72素晴らしい-アンドリュー/マスターCronExpressionと
タイムゾーンの問題、カレンダー、CalendarIntervalTriggerImpl

最初の公式リリースこの修正を含む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)); 
... 
関連する問題