2015-11-02 5 views
6

जेनकींस के रात के निर्माण पर, हमारे परीक्षणों में से एक 2:00:12 बजे विफल रहा। कुछ समय बाद मेरे कंप्यूटर के सिस्टमटाइम को डीबगिंग और बदलना, मैं बहुत उलझन में था। तब मैंने निम्नलिखित परीक्षण (समस्या को अनुकरण) लिखा, जो विफल रहता है, लेकिन मैं समझने में असमर्थ हूं कि क्यों। मैंने Google की कोशिश की, लेकिन कुछ भी समान नहीं मिला।
क्या कोई समझा सकता है कि आखिरी जोर क्यों विफल रहता है?भ्रमित परीक्षण विफल - डेलाइट सेविंग टाइम

@Test 
public void testFirstBeforeSecond_atDayLightSavingTime() throws ParseException { 
    Date first = new SimpleDateFormat("dd-MM-yyyy HH:mm").parse("25-10-2015 00:59"); 
    Date second = new SimpleDateFormat("dd-MM-yyyy HH:mm").parse("25-10-2015 01:01"); 
    assertThat(first.before(second), is(true)); // Ok, as expected 

    first = add(first, Calendar.HOUR_OF_DAY, 2); 
    second = add(second, Calendar.HOUR_OF_DAY, 2); 
    assertThat(first.before(second), is(true)); // Ok, as expected 

    first = add(first, Calendar.DAY_OF_YEAR, 2); 
    second = add(second, Calendar.DAY_OF_YEAR, 2); 
    assertThat(first.before(second), is(true)); // Fails? 
} 

private Date add(Date date, int field, int amount) { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeZone(TimeZone.getTimeZone("Europe/Brussels")); 
    calendar.setTime(date); 
    calendar.add(field, amount); 
    return calendar.getTime(); 
} 

+0

आप कभी भी टाइमज़ोन को परिभाषित नहीं करते हैं! तो इस कोड को चलाने वाले किसी भी डिवाइस पर होस्ट सिस्टम की डिफ़ॉल्ट समय क्षेत्र सेटिंग का उपयोग करता है। आपका स्थानीय कंप्यूटर स्थानीय समय और सर्वरों में अक्सर यूटीसी में चल रहा है। क्या आपने इस बारे में सोचा है? –

+0

संभवतः http://stackoverflow.com/questions/13611108/problems-with-java-daylight-savings-time – dkatzel

+1

@ReneM से संबंधित है। टाइमज़ोन निजी विधि 'एड' में सेट किया गया है: 'calendar.setTimeZone (TimeZone.getTimeZone (" यूरोप/ब्रसेल्स "));' – Manu

उत्तर

7

(ब्रसेल्स समय क्षेत्र में, डेलाइट बचत समय 25-10-15 पर 3 बजे समाप्त हो गया। घड़ी तो एक घंटे के वापस कूद गया।) आप हर कदम पर first और second प्रिंट आउट हैं रास्ते से, आप निम्न प्राप्त होते हैं:

आपका पहला matchup

Sun Oct 25 00:59:00 CEST 2015 
Sun Oct 25 01:01:00 CEST 2015 

जो वास्तव में अपेक्षा के अनुरूप है। मध्य यूरोपीय ग्रीष्मकालीन समय के दौरान, दो बार, दो मिनट अलग।

दूसरा मैचअप दिलचस्प हो जाता है। आपने प्रत्येक तिथि में दो घंटे जोड़े:

Sun Oct 25 02:59:00 CEST 2015 
Sun Oct 25 02:01:00 CET 2015 

अब दो बार डीएसटी स्विचओवर का विस्तार होता है। पहली बार गर्मी के समय के दौरान होता है, 2:59; दूसरी बार मानक समय के दौरान 2:01 पर है।

जब आप इसे करने के लिए दो दिन जोड़ने के लिए, ऐसा लगता है कि जावा की तरह सभी के बारे में गर्मी के समय भूल जाता है:

Tue Oct 27 02:59:00 CET 2015 
Tue Oct 27 02:01:00 CET 2015 

2:59 और 2:01, बिल्कुल के रूप में यह था ... इस दो दिन बाद हो सकता है कैलेंडर द्वारा, लेकिन पहली बार निश्चित रूप से चरण दो की तुलना में 48 घंटे बाद नहीं है!

आप

first = add(first, Calendar.HOUR_OF_DAY, 48); 
    second = add(second, Calendar.HOUR_OF_DAY, 48); 

में योग के अंतिम सेट बदल तो समस्या दूर हो जाने:

Tue Oct 27 01:59:00 CET 2015 
Tue Oct 27 02:01:00 CET 2015 

मेरा अनुमान है कि जावा डिजाइनरों से अपेक्षित व्यवहार के बारे में कुछ अनुमान करना था क्या "एन दिनों बाद" का मतलब था जब वह एक डीएसटी स्विचओवर फैलता है।

+0

... और निश्चित रूप से कोई "सही" समाधान नहीं है, केवल दो गलत समाधान हैं और आपको एक चुनना होगा। – biziclop

+0

खैर, जावा डिजाइनरों ने दिनों के अतिरिक्त को समझने का निर्णय लिया है कि स्थानीय समय अपरिवर्तित रखा जाएगा - और ऑफ़सेट को मानक समय में बदलें।लेकिन ऑफ़सेट बदलना इस मामले में तत्काल आगे एक घंटे बदल जाता है जिससे पहली तारीख दूसरी तारीख को पार कर जाती है। पहले मामले में: 1 दिन = 25 घंटे, दूसरे मामले में: 1 दिन = 24 घंटे। –

संबंधित मुद्दे