2008-11-04 13 views
8

आउटपुट के बाद कार्यक्रम। कोई मुझे बताएं कि 1 जनवरी 1 9 6 9 से 10,000,000 मिलीसेकंड क्यों 31 नवंबर, 1 9 6 9 है। ठीक है, कोई कृपया मेरी धारणा के साथ गलत क्या है कि पहली परीक्षा 1 जनवरी, 1 9 70 से 10,000,000 मिलीसेकंड का समय देनी चाहिए। 10,000,000 से अधिक उत्पादन एक ही परिणाम।Java.util.Calendar - 1 जनवरी 1 9 70 से मिलीसेकंड

public static void main(String[] args) { 

    String x = "10000000"; 
    long l = new Long(x).longValue(); 
    System.out.println("Long value: " + l); 

    Calendar c = new GregorianCalendar(); 
    c.setTimeInMillis(l); 
    System.out.println("Calendar time in Millis: " + c.getTimeInMillis()); 

    String origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH); 
    System.out.println("Date in YYYY-MM-DD format: " + origDate); 

    x = "1000000000000"; 
    l = new Long(x).longValue(); 
    System.out.println("\nLong value: " + l); 

    c.setTimeInMillis(l); 
    System.out.println("Calendar time in Millis: " + c.getTimeInMillis()); 

    origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH); 
    System.out.println("Date in YYYY-MM-DD format: " + origDate); 
} 

लांग मूल्य: Millis में 10000000

कैलेंडर समय: 10000000

में दिनांक YYYY-MM-DD स्वरूप: 1969-11-31

लांग मूल्य: लाख करोड़

मिलिस में कैलेंडर समय: 1000000000000

YYYY-MM-DD स्वरूप में: 2001-8-8

उत्तर

12

दिनांकों आप प्रिंट Calendar आपके समय क्षेत्र के स्थानीय हैं से कर सकते हैं , जबकि युग को यूटीसी में 1 9 70-01-01 के मध्यरात्रि के रूप में परिभाषित किया गया है। तो यदि आप यूटीसी के पश्चिम में एक टाइमज़ोन में रहते हैं, तो आपकी तिथि 1 9 6 9-12-31 के रूप में दिखाई देगी, भले ही (यूटीसी में) यह अभी भी 1 980-01-01 है।

+2

धन्यवाद! मैने सोचा मैं पागल हो गया था। –

0

आप अपने आप को यह पता लगाने अगर आप बदलना आपकी पहली में c.setTimeInMillis(l);c.clear();

6

पहले, c.get (Calendar.MONTH) रिटर्न 0 जन, फर के लिए 1, आदि के लिए

दूसरा, उत्पादन तिथियों के लिए उपयोग DateFormat।

तीसरा, आपकी समस्याएं एक शानदार उदाहरण हैं कि जावा की डेट एपीआई कितनी अजीब है। यदि आप कर सकते हैं तो जोडा टाइम एपीआई का प्रयोग करें। यह आपके जीवन को कुछ हद तक आसान बना देगा।

public static void main(String[] args) { 

    final DateFormat dateFormat = SimpleDateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL); 

    long l = 10000000L; 
    System.out.println("Long value: " + l); 
    Calendar c = new GregorianCalendar(); 
    c.setTimeInMillis(l); 
    System.out.println("Date: " + dateFormat.format(c.getTime())); 

    l = 1000000000000L; 
    System.out.println("\nLong value: " + l); 
    c.setTimeInMillis(l); 
    System.out.println("Date: " + dateFormat.format(c.getTime())); 
} 
+0

बहुत उपयोगी; आपने मेरे प्रश्न का थोड़ा अप्रत्यक्ष उत्तर दिया। समय क्षेत्र की बात मुझे सबसे भ्रम पैदा कर रही थी।बेहतर कोड की सराहना की जाती है। –

5

Calendar#setTimeInMillis() 1 जनवरी, 1970 जीएमटी के बाद मिलीसेकेंड की संख्या के लिए कैलेंडर के समय सेट:

यहाँ अपने कोड है, जो समय-क्षेत्र को इंगित करता है की एक बेहतर उदाहरण है।

Calendar#get() कैलेंडर के टाइमज़ोन के लिए अनुरोधित अनुरोधित फ़ील्ड लौटाता है, जो डिफ़ॉल्ट रूप से आपकी मशीन का स्थानीय टाइमज़ोन है।

के रूप में आप जब आप कैलेंडर का निर्माण आप "GMT" समय क्षेत्र निर्दिष्ट करते हैं तो उम्मीद यह काम करना चाहिए:

Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT")); 
+0

कोड उदाहरण के लिए धन्यवाद। –

1

आपका समय क्षेत्र सबसे अधिक संभावना जीएमटी (जैसे, जीएमटी -5) से पीछे है, इसलिए से 10,000,000ms युग 31 दिसंबर 1 9 6 9 आपके टाइमज़ोन में है, लेकिन महीनों से जावा-आधारित में शून्य-आधारित हैं। कैलेंडर कैलेंडर>> टेक्स्ट रूपांतरण त्रुटिपूर्ण है और आपको 1 9 6 9 -31-31 की अपेक्षा 1 9 6 9-11-31 मिलती है।

3

अफसोस की बात है, java.util.Date और java.util.Calendar खराब तरीके से इस तरह के भ्रम की ओर अग्रसर डिजाइन किए गए थे।

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