2009-08-06 11 views
18

निम्नलिखित कोड java.util.Date में एक बग प्रदर्शित करने के लिए प्रतीत होता है, जिससे एक घंटा जोड़ा जाता है, यदि स्थानीय घड़ी जीएसटी पर डीएसटी समायोजन के साथ सेट की जाती है और समय 1 नवंबर 1 9 71 से पहले होता है। मेरी पहली धारणा हमेशा होती है कि मैं क्या यह गलत है। क्या कोई देख सकता है कि क्या गलत है (या यह वास्तव में जावा बग है)? 1 नवंबर 1 9 71 के बारे में क्या महत्वपूर्ण है?1 नवंबर 1 9 71 से पहले तारीखों के लिए java.util.Date पर एक घंटे क्यों जोड़ा जाता है?

import java.text.SimpleDateFormat; 
import java.util.Locale; 
import java.util.TimeZone; 

class JavaUtilDateBug 
{ 
    private static void demo() throws Exception 
    { 
     // UK developers usually have the clock on their development machines set 
     // to "Europe/London" (i.e. GMT with daylight saving). Set it explicitly 
     // here so readers in other countries can see the problem too. 
     TimeZone.setDefault(TimeZone.getTimeZone("Europe/London")); 
     Locale.setDefault(Locale.ENGLISH); 

     SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy"); 
     String strJan1st1970Expected = "Thu Jan 01 00:00:00 GMT 1970"; 
     String strJan1st1970Actual = dateFormat.parse(strJan1st1970Expected).toString(); 
     System.out.println("strJan1st1970Actual: " + strJan1st1970Actual); // -> "Thu Jan 01 01:00:00 GMT 1970" 
     boolean jvmHasDateBug = !strJan1st1970Expected.equals(strJan1st1970Actual); 
     System.out.println("jvmHasDateBug: " + jvmHasDateBug); // -> true 

     // The anomaly only seems to affect times before 1 Nov 1971. 
     final String strNov1st1971 = "Mon Nov 01 00:00:00 GMT 1971"; 
     assert strNov1st1971.equals(dateFormat.parse(strNov1st1971).toString()); 
    } 

    public static void main(String[] args) 
    { 
     try 
     { 
      demo(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

मेरे जावा वातावरण:

java version "1.6.0_13" 
    Java(TM) SE Runtime Environment (build 1.6.0_13-b03) 
    Java HotSpot(TM) Client VM (build 11.3-b02, mixed mode, sharing) 
+1

आपका डेमो प्रोग्राम केवल गैर-अंग्रेज़ी मशीनों पर काम करता है यदि आप लोकेल भी सेट करते हैं (दिनांक पार्सिंग अन्यथा विफल रहता है)। –

+0

धन्यवाद, माइकल। डेमो कोड अपडेट किया गया। –

उत्तर

5

मुझे सूर्य के बग डेटाबेस में matching bug मिला। ऐसा लगता है कि वे इसे "ऐतिहासिक गलतता" मानते हैं (प्रारूपण को स्पष्ट रूप से जीएमटी के बजाय समय क्षेत्र के रूप में "बीएसटी" का उत्पादन करना चाहिए - यह समय सही होगा) और इसे ठीक नहीं करेगा, क्योंकि गहराई से, टाइमज़ोन कार्यान्वयन स्थानों को संभाल नहीं सकता अपने समय क्षेत्र का नाम बदलना।

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

+0

बग डेटाबेस में अब उपलब्ध नहीं है। –

13

यह स्थान है। से http://en.wikipedia.org/wiki/British_Summer_Time

ब्रिटिश मानक समय योजना 27 अक्टूबर 1968 और 31 अक्टूबर 1971, जब ब्रिटेन जीएमटी + 1 साल पर बने रहे के बीच trialled किया गया था।

+0

वाह, सोचा था कि दो बार जवाब देने के लिए बहुत अस्पष्ट हो गया था ... –

+0

बह। जब मैंने आपके दो अधिसूचित किए थे तो मेरे पास मा आधा जवाब था। –

21

27 अक्टूबर 1 9 68 और 31 अक्टूबर 1 9 71 के बीच ब्रिटिश मानक समय का परीक्षण किया गया, जो मुझे संदेह है कि इस मुद्दे का कारण क्या है।

वहाँ परीक्षण के कुछ विवरण यहाँ है:

http://en.wikipedia.org/wiki/British_Summer_Time#Single.2FDouble_Summer_Time

जनवरी 1st 1970 में यूरोप/लंदन के लिए समय क्षेत्र जनवरी 01 था ब्रिटिश मानक समय (GMT + 1) तो पार्स करने के लिए जब आप एक java.text.SimpleDateFormat का उपयोग 00:00:00 जीएमटी 1 9 70 यह बीएसटी में 01 जनवरी 01:00:00 1 9 70 के बराबर सही युग मूल्य उत्पन्न करता है।

फिर, java.util.Date की crappiness की वजह से, जब आप java.util.Date.toString() फोन यह अब, जो जीएमटी में बदल गया है के रूप में वर्तमान स्थानीय के लिए डिफ़ॉल्ट समय क्षेत्र का उपयोग करता है और आप जनवरी 01 01:00:00 GMT 1970 मिलता है।

+0

दिलचस्प। अभी भी स्पष्ट नहीं है कि यह सममित क्यों नहीं है, हालांकि - यदि आप "गुरु जनवरी 01 00:00:00 जीएमटी 1 9 70" में भोजन करते हैं तो आपको वही वापस मिलना चाहिए। –

+0

यह java.util के साथ कोई समस्या नहीं है।दिनांक की ToString(), व्यवहार अलग नहीं होता है जब आप इसे उसी सरलडेटाफॉर्मैट का उपयोग करके प्रारूपित करते हैं जिसका उपयोग आप पार्सिंग के लिए करते थे। इस पर सूर्य के लिए मेरा उत्तर देखें। –

+0

अरे माइकल - सामान्य() विधि java.util.Date पर एक नज़र डालें। इसे toString() विधि से कहा जाता है और टाइमज़ोन प्राप्त करने के लिए TimeZone.getDefaultRef() को कॉल करता है। यह सही कारण की तरह दिखता है? –

0

यह एक बग नहीं है।

आप BST जो (GMT + 1), Jan 1 1970 00:00:00 की GMT तारीख, जब आप इस तिथि को अपना डिफ़ॉल्ट BST समय क्षेत्र का उपयोग कर पार्स है करने के लिए अपने डिफ़ॉल्ट समय क्षेत्र की स्थापना की है, यह हमेशा समय आपके वर्तमान समय क्षेत्र के आधार पर प्रदर्शित करता है (ऑटो GMT से ऑफसेट लागू होता है) ।

इस मामले में यह GMT + 1 था, यही कारण है कि आपका परिणाम एक घंटे का था।

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