2013-03-28 12 views
5

यह प्रश्न this one से संबंधित है, लेकिन इसे अधिक सामान्य रखा जाता है और इसका स्वतंत्र रूप से इलाज किया जा सकता है।क्वार्ट्ज.नेट - क्या यह यूनिट परीक्षण पास नहीं होना चाहिए?

संपादित करें: क्वार्ट्ज संस्करण 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 में सही है। यूटीसी 12:00 का परिणाम गर्मियों के दौरान 14:00 बजे होगा (जो उस बिंदु पर पहले ही शुरू हो चुका है)। इससे कोई फर्क नहीं पड़ता कि GetNextValidTimeAfter() पैरामीटर गर्मियों की अवधि के अंदर या बाहर एक समय निर्दिष्ट करता है।

क्या अगला वैलिडटाइम बराबर होना चाहिए या मेरा दृष्टिकोण त्रुटिपूर्ण होना चाहिए?

+1

यह मेरे लिए ठीक (मैं अपने TZ में नहीं कर रहा हूँ) से गुजरता है और अगर मैं सिर्फ शुरुआत के साथ एक नया 'DaylightTime' वस्तु बना सकते हैं और अंत में आप विस्तृत गए तारीखें (जैसे 'डेलाइट चेंज = नया डेलाइटटाइम (नया डेटटाइम (2013, 3, 31, 2, 0, 0), नया डेटटाइम (2013, 10, 27, 2, 0, 0), टाइमस्पेन। मेनवैल्यू) ') यह भी गुजरता है। –

+0

धन्यवाद, इसने मुझे नए क्वार्ट्ज संस्करणों पर एक और नज़र डालने के लिए प्रोत्साहित किया। मैंने पहले से ही साइट पर परिवर्तन-लॉग की जांच की है, जो संबंधित फिक्स का उल्लेख नहीं करता है। हालांकि, जब मैंने भंडार में काम करने के माध्यम से देखा तो मैंने देखा कि वास्तव में इसके लिए एक फिक्स था। मैं विस्तृत जानकारी के साथ एक जवाब जोड़ दूंगा। –

+0

मैंने 2.1.2.400, एफडब्ल्यूआईडब्ल्यू के साथ इसकी कोशिश की –

उत्तर

8

मुझे पता चला कि यह वास्तव में क्वार्ट्ज.NET 2.0.1 में एक बग है, लेकिन इसे पहले से ही 2.1.0 में तय कर दिया गया है।

मैंने साइट पर परिवर्तन-लॉग की जांच की, जो संबंधित फिक्स का उल्लेख नहीं करता है। पीटर रिची की टिप्पणी ने मुझे नए क्वार्ट्ज संस्करणों पर एक और नज़र डालने के लिए प्रोत्साहित किया। जब मैंने रिपोजिटरी में काम करने के माध्यम से देखा तो मैंने देखा कि वास्तव में इसके लिए एक फिक्स था।

यह संशोधन 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)); 
... 
संबंधित मुद्दे