2012-11-02 9 views
18

मैं जावा दिनांक और कैलेंडर का उपयोग करके एक समय क्षेत्र से दूसरे में एक सरल रूपांतरण प्राप्त करने का प्रयास कर रहा हूं। मैं निम्नलिखित कोडतारीख को विभिन्न समय क्षेत्र में कनवर्ट करें

Calendar instance = Calendar.getInstance(TimeZone.getTimeZone("Europe/London")); 
    Date date = instance.getTime(); 
    System.out.println(date); 

    GregorianCalendar instance2 = new GregorianCalendar(TimeZone.getTimeZone("Europe/Athens")); 
    instance2.setTime(instance.getTime()); 
    System.out.println(instance2.getTime()); 

को चलाने के लिए कोशिश कर रहा हूँ, लेकिन है कि अभी भी बल्कि +1 घंटे से भी एक ही तिथि देता है, ... पूरी समस्या तुच्छ लगता है, लेकिन मैं इस के लिए किसी भी सरल उत्तर नहीं मिलता है। आपकी सहायता के लिये पहले से ही धन्यवाद।

+4

क्या आप [जोडा टाइम] (http://stackoverflow.com/a/375803/1037210) का उपयोग करना चाहते हैं? यह मेरी वरीयता है। – Lion

+0

जांचें [यह उत्तर] (http://stackoverflow.com/questions/230126/how-to-handle-calendar-timezones-using-java)। यह काम में आ सकता है। – Gamb

+0

मुझे वेब पर एक और चीज मिली, जो संभवतः सबसे साफ समाधान है, दिनांक स्ट्रिंग को पार्स करने के लिए डेट टाइम प्रारूप का उपयोग करने के लिए और संबंधित समय क्षेत्र – Bober02

उत्तर

31

जब आप System.out.println(date); or System.out.println(instance2.getTime()); का उपयोग कर तारीख प्रिंट, Dateinstance2.getTime() द्वारा दिया TimeZone independent है और हमेशा स्थानीय समय क्षेत्र में तारीख प्रिंट करता है।

इसके बजाय आप DateFormat/SimpleDateFormat उपयोग कर सकते हैं:

DateFormat formatter= new SimpleDateFormat("MM/dd/yyyy HH:mm:ss Z"); 
    formatter.setTimeZone(TimeZone.getTimeZone("Europe/London")); 
    System.out.println(formatter.format(date)); 

    formatter.setTimeZone(TimeZone.getTimeZone("Europe/Athens")); 
    System.out.println(formatter.format(instance2.getTime())) 
+0

क्या आप वाकई स्थानीय टाइमज़ोन हैं और ईपीओसी सेकेंड नहीं (टाइमज़ोन-स्वतंत्र)? http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#getTime() – akaIDIOT

+0

@akaIDIOT आंतरिक प्रतिनिधित्व युग के बाद से है, जब तारीख मुद्रित होती है तो स्थानीय टाइमज़ोन का उपयोग किया जाता है , 'java.util.Date' की सुविधा/बग। – dan

+0

@ बॉबर्ट 02: क्या आपको कुछ बेहतर मिला? यदि हां, तो कृपया साझा करें। –

2

आप नीचे दिए गए कोड का उपयोग कर सकते झलकी

String dateString = "14 Jul 2014 00:11:04 CEST"; 
date = formatter.parse(dateString); 
System.out.println(formatter.format(date)); 

// Set the formatter to use a different timezone - Indochina Time 
formatter.setTimeZone(TimeZone.getTimeZone("Asia/Bangkok")); 
System.out.println("ICT time : "+formatter.format(date)); 
8

स्वीकार किए जाते हैं जवाब सही है। Java.util.Date क्लास में असाइन किया गया कोई समय क्षेत्र नहीं है, फिर भी यह toString कार्यान्वयन भ्रमित रूप से JVM के वर्तमान डिफ़ॉल्ट समय क्षेत्र को लागू करता है।

बचें java.util.Date & .Calendar

यह कई कारणों से बेहद परेशानी java.util.Date, .Calendar, और SimpleDateFormat वर्गों जावा के साथ बंडल से बचने के लिए में से एक है। उनसे बचें। इसके बजाय का उपयोग या तो:

  • Joda-Time
  • नई java.time package जावा 8 के साथ बंडल और Joda समय से प्रेरित है।

Joda समय

Joda समय 2.3 इस प्रकार के कुछ उदाहरण कोड। कई और उदाहरणों और अधिक चर्चा के लिए StackOveflow खोजें।

DateTimeZone timeZoneLondon = DateTimeZone.forID("Europe/London"); 
DateTimeZone timeZoneAthens = DateTimeZone.forID("Europe/Athens"); 

DateTime nowLondon = DateTime.now(timeZoneLondon); 
DateTime nowAthens = nowLondon.withZone(timeZoneAthens); 
DateTime nowUtc = nowLondon.withZone(DateTimeZone.UTC); 

java.time

जावा 8 और बाद के एक नए java.time package में निर्मित है। यह पैकेज जोडा-टाइम से प्रेरित था। जबकि वे कुछ समानताएं और वर्ग के नाम साझा करते हैं, वे अलग हैं; प्रत्येक में अन्य कमीएं हैं। एक उल्लेखनीय अंतर यह है कि जावा.टाइम कन्स्ट्रक्टर से बचाता है, इसके बजाय स्थैतिक अस्थिरता विधियों का उपयोग करता है।

इस प्रश्न के मामले में, वे एक ही फैशन में काम करते हैं। समय क्षेत्र निर्दिष्ट करें, और वर्तमान पल प्राप्त करने के लिए now विधि पर कॉल करें, फिर समय क्षेत्र के लिए समायोजित करने के लिए पुराने अपरिवर्तनीय उदाहरण के आधार पर एक नया उदाहरण बनाएं।

दो अलग-अलग समय क्षेत्र कक्षाओं पर ध्यान दें। एक नामित समय क्षेत्र है जिसमें डेलाइट सेविंग टाइम और अन्य ऐसे विसंगतियों के साथ-साथ यूटीसी से ऑफसेट भी शामिल है, जबकि दूसरा ऑफसेट है।

ZoneId zoneMontréal = ZoneId.of("America/Montreal"); 
ZonedDateTime nowMontréal = ZonedDateTime.now (zoneMontréal); 

ZoneId zoneTokyo = ZoneId.of("Asia/Tokyo"); 
ZonedDateTime nowTokyo = nowMontréal.withZoneSameInstant(zoneTokyo); 

ZonedDateTime nowUtc = nowMontréal.withZoneSameInstant(ZoneOffset.UTC); 

असल java.util.Date वर्ग करता एक समय क्षेत्र its source code भीतर दफन है। लेकिन वर्ग उस व्यावहारिक उद्देश्यों के लिए उस समय क्षेत्र को अनदेखा करता है। तो, शॉर्टेंड के रूप में, अक्सर यह कहा जाता है कि j.u.Date का कोई समय क्षेत्र असाइन नहीं किया गया है। भ्रामक? हाँ। J.u.Date की गड़बड़ी से बचें और जोडा-टाइम और/या जावा.टाइम के साथ जाएं।

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

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