2009-11-11 31 views
13

देता है मैं Joda time (1.6) पुस्तकालयों का उपयोग कर रहा हूं और यह गलत समय क्षेत्र, जीएमटी के बजाय ब्रिटिश ग्रीष्मकालीन समय के साथ डेटटाइम ऑब्जेक्ट्स लौटता रहता है।जोडा समय गलत समय क्षेत्र

मेरा विंडोज वर्कस्टेशन (जेडीके 1.6.0_16 चल रहा है) सोचता है कि यह जीएमटी में है और यदि मुझे जेडीके दिनांक/समय कक्षाओं से डिफ़ॉल्ट समय क्षेत्र मिलता है तो यह सही (जीएमटी) है। मुझे हमारे लिनक्स सर्वर पर भी वही व्यवहार मिलता है। मैंने सोचा कि यह जोडा में समय क्षेत्र डेटाबेस फ़ाइलों में एक त्रुटि हो सकती है, इसलिए मैंने नवीनतम डेटाबेस के साथ जार का पुनर्निर्माण किया लेकिन बिना किसी बदलाव के। स्थिर initialiser org.joda.time.DateTimeZone में मैं देख रहा हूँ System.getProperty("user.timezone") कॉल "Europe/London" देता है कि उम्मीद के रूप में के माध्यम से

import java.util.TimeZone; 
import org.joda.time.DateTime; 
import org.joda.time.DateTimeZone; 
import org.joda.time.LocalTime; 
import org.joda.time.format.DateTimeFormatter; 
import org.joda.time.format.ISODateTimeFormat; 

public class TimeZoneTest { 

    public static void main(String[] args) {     
     DateTimeFormatter timeParser = ISODateTimeFormat.timeParser(); 
     TimeZone timeZone = TimeZone.getDefault(); 
     System.out.println(timeZone.getID()); // "Europe/London" 
     System.out.println(timeZone.getDisplayName()); // "Greenwich Mean Time" 

     DateTimeZone defaultTimeZone = DateTimeZone.getDefault(); 
     System.out.println(defaultTimeZone.getID()); //"Europe/London" 
     System.out.println(defaultTimeZone.getName(0L)); //"British Summer Time" 

     DateTime currentTime = new DateTime(); 
     DateTimeZone currentZone = currentTime.getZone(); 
     System.out.println(currentZone.getID()); //"Europe/London" 
     System.out.println(currentZone.getName(0L)); //"British Summer Time"    
    } 
} 

डिबगिंग।

+0

वास्तविक समस्या के स्पष्टीकरण प्रदान करने के लिए विस्तारित उत्तर – jitter

उत्तर

30

ठीक है, इसकी जड़ पाने के लिए आपको ब्रिटिश समर टाइम का वास्तव में क्या मतलब है और जब यह जगह पर था, तो परिचित होना होगा। इसे कम करने के लिए आप 0L से getName() पास करते हैं जो 1970-01-01T00:00:00Z है इसलिए DefaultTimeZone उस समय टाइमज़ोन का नाम देखता है। ब्रिटिश ग्रीष्मकालीन समय कौन सा था।

से: http://www.nmm.ac.uk/explore/astronomy-and-time/time-facts/british-summer-time

1968 में घड़ियों 18 फरवरी को एक घंटे उन्नत थे GMT के आगे और ब्रिटिश मानक समय है, जिसके दौरान घड़ियों जीएमटी के अग्रिम पूरे साल में रखा गया था जब तक इसलिए बने रहे, में 27 के बीच बल अक्टूबर 1968 और 31 अक्तूबर 1971

आप के बजाय मिलीसेकेंड sinc की सही मात्रा में पास होता तो आया ई 1970-01-01T00:00:00Z। जैसे

defaultTimeZone.getName(new GregorianCalendar().getTimeInMillis()) 

आपको सही स्ट्रिंग भी मिल जाएगी। असल में आपने getName() विधि को गलत पैरामीटर को एक अप्रत्याशित परिणाम के साथ समाप्त कर दिया है।

यदि आप विस्तार से जांचना चाहते हैं तो जोडा स्रोत के org/joda/time/tz/src में फ़ाइलों को जांचें ताकि यह देखने के लिए कि जोडा समय क्षेत्र निर्धारित करता है।


defaultTimeZone.getName(0L) 

के बजाय

आप

defaultTimeZone.toTimeZone().getDisplayName() 

जो यह मेरे लिए करता है इस्तेमाल कर सकते हैं।

+6

बहुत बढ़िया।किसने सोचा होगा। मैं सचमुच कहूंगा "ऐसा कोई तरीका नहीं है कि 1 जनवरी 1 9 70 ब्रिटिश ग्रीष्मकालीन समय में था"। मुझे और मूर्ख यह अंतर्निहित समस्या भी बताता है जो ISODateTimeFormat.timeParser() के साथ "10: 00: 00.0000000 + 00: 00" को पार्स करने वाले प्रश्न का नेतृत्व करता है जिसके परिणामस्वरूप जीएमटी + 1 में डेटटाइम होता है। इसका कारण यह है कि जोडा के पास समय और तिथि की कोई स्वतंत्र धारणा नहीं है, इसलिए इस बार 1 जनवरी 1 9 70 के सापेक्ष पार्स किया गया था, जैसा कि आपने बताया कि जीएमटी + 1 था! पागल। धन्यवाद। प्रासंगिक होने के लिए – matthewKizoom

+0

+1 और एक छोटा इतिहास सबक भी – I82Much

0

यह 1.6 में DateTimeZone वर्ग के लिए स्थिर initialiser को देखने के लिए आपकी रुचि हो सकती:

static { 
    setProvider0(null); 
    setNameProvider0(null); 

    try { 
     try { 
      cDefault = forID(System.getProperty("user.timezone")); 
     } catch (RuntimeException ex) { 
      // ignored 
     } 
     if (cDefault == null) { 
      cDefault = forTimeZone(TimeZone.getDefault()); 
     } 
    } catch (IllegalArgumentException ex) { 
     // ignored 
    } 

    if (cDefault == null) { 
     cDefault = UTC; 
    } 
} 

मेरा अनुमान है कि आप एक user.timezone संपत्ति परिभाषित (और BST करने के लिए सेट) होता है। अन्यथा, ऐसा लगता है कि जोडा को जेडीके समय क्षेत्र के आधार पर अपना टाइमज़ोन उदाहरण बनाना चाहिए; और मैं इस क्षेत्र में किसी भी बग की अपेक्षा करता हूं, विशेष रूप से जीएमटी जोन को परिवर्तित करना, अब तक उठाया जाएगा।

+0

उपयोगकर्ता। टाइमज़ोन "यूरोप/लंदन" देता है (मैंने इसे प्रश्न में जोड़ा है)। – matthewKizoom

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