2012-10-12 24 views
7

मैं मिलीसेकंद टाइम स्टैम्प से XMLGregorian कैलेंडर और पीछे में कनवर्ट करने की कोशिश कर रहा हूं, लेकिन मुझे गलत परिणाम मिल रहे हैं। क्या मुझसे कुछ गलत हो रही है? ऐसा लगता है कि मुझे दिन मिल रहा है।लंबे समय तक XMLGregorian कैलेंडर और लंबे समय तक

// Time stamp 01-Jan-0001 00:00:00.000 
    Long ts = -62135740800000L; 
    System.out.println(ts); 
    System.out.println(new Date(ts)); // Sat Jan 01 00:00:00 PST 1 .. Cool! 

    // to Gregorian Calendar 
    GregorianCalendar gc = new GregorianCalendar(); 
    gc.setTimeInMillis(ts); 

    // to XML Gregorian Calendar 
    XMLGregorianCalendar xc = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc); 

    // back to GC 
    GregorianCalendar gc2 = xc.toGregorianCalendar(); 

    // to Timestamp 
    Long newTs = gc2.getTimeInMillis(); 
    System.out.println(newTs); // -62135568000000 .. uh? 
    System.out.println(new Date(newTs)); // Mon Jan 03 00:00:00 PST 1 .. where did the extra days come from? 

उत्तर

0

मुझे विश्वास है कि यहां समस्या है। प्रति दस्तावेज, toGregorianCalendar()GregorianCalendar पर किसी भी फ़ील्ड गुम होने पर रूपांतरण के लिए संबंधित डिफ़ॉल्ट पर निर्भर करता है।

आप का प्रयास करें:

Date date = new Date(); 
long ts = date.getTime(); //in place of your input 

और अपने कोड चलाने के लिए, यदि आप पाते हैं चाहिए, दोनों to और from रूपांतरण काम कर ठीक।

यदि आप अपने उदाहरण में कस्टम प्रदान इनपुट के साथ toGregorianCalendar() चाहते हैं, तो कृपया toGregorianCalendar(TimeZone,Locale,Defaults) का उपयोग करें और रूपांतरण में उपयोग किए जाने वाले अपडेट किए गए डिफ़ॉल्ट को आपूर्ति करें।

3

दिलचस्प - यह मूल्यों के बारे में (लगभग) -10000000000000L (और सकारात्मक मूल्य) के लिए ठीक काम करता है लेकिन बड़े नकारात्मक मूल्य असंगत हो जाते हैं।

आप gc, xc, और gc2 प्रिंट आउट हैं, तो आप देख सकते हैं, जहां समस्या पैदा होती है (XMLGregorianCalendar से रूपांतरण

gc: java.util.GregorianCalendar[time=-62135740800000 ... DAY_OF_WEEK=7 
xc: 0001-01-01T08:00:00.000Z 
gc2: java.util.GregorianCalendar[time=? ... DAY_OF_WEEK=5 

ग्रेगोरी कैलेंडर के लिए आप बाहर xc के क्षेत्र मुद्रित हैं, तो आप 1,1 मिल , 1।

System.out.println(xc.getYear()); 
    System.out.println(xc.getMonth()); 
    System.out.println(xc.getDay()); 

gc2 के लिए, आप 1,0,1 मिल (जो xc से मेल खाता है, क्योंकि महीनों ग्रेगोरी कैलेंडर में शून्य आधारित हैं)

System.out.println(gc2.get(gc2.YEAR)); 
    System.out.println(gc2.get(gc2.MONTH)); 
    System.out.println(gc2.get(gc2.DAY_OF_MONTH)); 

हालांकि, इन 3 println कॉल जोड़ने gc2 बाहर मुद्रण से उत्पादन में परिवर्तन! time=?gc2 से आउटपुट time=-62135568000000 में बदलता है - इसलिए GregorianCalendar ऑब्जेक्ट से पूछताछ करके कुछ गणना ट्रिगर की गई है; areFieldsSet संपत्ति false से true में भी बदलती है।

दो ग्रेगोरियन कैलेंडर के समय क्षेत्र अलग हैं, लेकिन यह त्रुटि के लिए जिम्मेदार नहीं है, जो तब भी जारी रहता है जब आप स्पष्ट टाइमज़ोन और लोकेल सेट करते हैं।

+0

यदि मैं 'gc2.get (ग्रेगोरियन कैलेंडर.वाययर) जोड़ता हूं, तो दिन सही है, लेकिन अब वर्ष 1 9 6 9 साल से बंद है। –

+0

यह अजीब है - मुझे यह नहीं दिख रहा है! दिन गलत रहता है और वर्ष अभी भी 1 है। मुझे आश्चर्य है कि यह जावा के संस्करण (मैं 1.6.0_27 का उपयोग कर रहा हूं) या लोकेल (मैं 'en_GB') पर निर्भर करता हूं .. ??? – DNA

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