2013-03-28 28 views
5

Câu hỏi này có liên quan đến this one, nhưng được giữ tổng quát hơn và có thể được xử lý độc lập.Quartz.NET - Không nên vượt qua bài kiểm tra đơn vị này?

EDIT: Quartz phiên bản v2.0.1

Từ sự hiểu biết của tôi, kiểm tra đơn vị sau đây cần pass:

[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); 
} 

Tuy nhiên (như bạn có thể nhìn thấy), các nextValidTimeFromBefore khác với nextValidTimeFromAfter. Kết quả trong nextValidTimeFromAfter là chính xác. Các UTC 12:00 sẽ dẫn đến 14:00 trong mùa hè (đã bắt đầu tại thời điểm đó). Không quan trọng nếu tham số GetNextValidTimeAfter() chỉ định thời gian bên trong hoặc bên ngoài khoảng thời gian mùa hè.

Nếu NextValidTimes bằng hoặc phương pháp tiếp cận của tôi có thiếu sót không?

+1

Điều này sẽ tốt cho tôi (tôi không nằm trong TZ) và nếu tôi chỉ tạo đối tượng 'DaylightTime' mới có ngày bắt đầu và ngày kết thúc bạn đã chi tiết (ví dụ: 'daylightChange = new DaylightTime (new DateTime (2013, 3, 31, 2, 0, 0), DateTime mới (2013, 10, 27, 2, 0, 0), TimeSpan.MinValue)') nó cũng đi qua. –

+0

Cảm ơn, điều này đã khuyến khích tôi xem xét các phiên bản Quartz mới hơn. Tôi đã kiểm tra nhật ký thay đổi trên trang web, điều này không đề cập đến bản sửa lỗi có liên quan. Tuy nhiên, khi tôi nhìn qua các cam kết trong kho tôi nhận thấy có thực sự là một sửa chữa cho việc này. Tôi sẽ thêm một câu trả lời với thông tin chi tiết. –

+0

Tôi đã thử điều này với 2.1.2.400, FWIW –

Trả lời

8

Tôi đã tìm ra rằng đây thực sự là một lỗi trong Quartz.NET 2.0.1, nhưng nó đã được sửa trong 2.1.0.

Tôi đã kiểm tra nhật ký thay đổi trên trang web, không đề cập đến sửa lỗi có liên quan. Lời nhận xét của Peter Ritchie đã khuyến khích tôi xem xét các phiên bản Quartz mới hơn. Khi tôi nhìn qua các cam kết trong kho tôi nhận thấy có thực sự là một sửa chữa cho việc này.

Nó đã được cố định trong phiên bản 665:

Merge yêu cầu kéo # 72 từ tuyệt vời-andrew/master
vấn đề khu Time với CronExpression, lịch, CalendarIntervalTriggerImpl

Phiên bản chính thức đầu tiên có chứa bản sửa lỗi này là v2.1.0, được gắn thẻ tại bản sửa đổi 685.

Lỗi này được đặt trong CronExpression.GetTimeAfter() (được gọi là 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)); 
...