2013-03-28 76 views
5

此問題與this one有關,但保持更一般化,可以單獨處理。Quartz.NET - 這個單元測試不應該通過嗎?

編輯:石英版本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 = new DaylightTime(新的DateTime(2013,3,31,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。

我查了變化日誌的網站,它沒有提到一個相關的修復上。彼得裏奇的評論鼓勵我再看看更新的Quartz版本。當我查看存儲庫中的提交時,我注意到實際上有一個解決方案。

它已被固定在修訂版665:從

合併拉請求#72驚人的安德魯/主
與CronExpression 時區的問題,日曆,CalendarIntervalTriggerImpl

第一次正式發佈包含此修復程序是V2.1.0,它被標記爲修訂685

的錯誤是位於CronExpression.GetTimeAfter()(由稱爲):

... 
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)); 
... 
相關問題