2012-09-19 22 views
17

मेरे पास एक टाइमस्टैम्प है जो यूटीसी में है और मैं TimeZone.getTimeZone("PST") जैसे एपीआई कॉल का उपयोग किये बिना इसे स्थानीय समय में बदलना चाहता हूं। आपको यह कैसे करना है? मैं बहुत सफलता के बिना निम्नलिखित कोड का उपयोग कर रहे:जावा: आप स्थानीय समय पर यूटीसी टाइमस्टैम्प कैसे परिवर्तित करते हैं?

private static final SimpleDateFormat mSegmentStartTimeFormatter = new  SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 

Calendar calendar = Calendar.getInstance(); 

    try { 
     calendar.setTime(mSegmentStartTimeFormatter.parse(startTime)); 
    } 
    catch (ParseException e) { 
     e.printStackTrace(); 
    } 

    return calendar.getTimeInMillis(); 

नमूना इनपुट मूल्य: [2012-08-15T22:56:02.038Z]

[2012-08-15T15:56:02.038Z]

उत्तर

38

Date के बराबर लौटना चाहिए UTC में समय ज़ोन नहीं और आंतरिक रूप से स्टोर हैं। केवल जब दिनांक स्वरूपित होता है तो टाइमज़ोन सुधार लागू होता है। DateFormat का उपयोग करते समय, यह उस जेवीएम के टाइमज़ोन पर डिफ़ॉल्ट होता है जो इसे चल रहा है। इसे आवश्यकतानुसार बदलने के लिए setTimeZone का उपयोग करें।

DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC")); 

Date date = utcFormat.parse("2012-08-15T22:56:02.038Z"); 

DateFormat pstFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 
pstFormat.setTimeZone(TimeZone.getTimeZone("PST")); 

System.out.println(pstFormat.format(date)); 

यह प्रिंट 2012-08-15T15:56:02.038

ध्यान दें कि मैं पीएसटी प्रारूप में 'Z' बाहर छोड़ दिया के रूप में यह यूटीसी इंगित करता है। अगर तुम सिर्फ Z साथ चला गया तो उत्पादन होगा 2012-08-15T15:56:02.038-0700

+5

कूल वास्तव में काम किया। मैं TimeZone.getDefault() को कॉल करके एंड्रॉइड डिवाइस का डिफ़ॉल्ट टाइमज़ोन प्राप्त करने में सक्षम था। –

0

यहाँ एक सरल संशोधित समाधान

public String convertToCurrentTimeZone(String Date) { 
      String converted_date = ""; 
      try { 

       DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
       utcFormat.setTimeZone(TimeZone.getTimeZone("UTC")); 

       Date date = utcFormat.parse(Date); 

       DateFormat currentTFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
       currentTFormat.setTimeZone(TimeZone.getTimeZone(getCurrentTimeZone())); 

       converted_date = currentTFormat.format(date); 
      }catch (Exception e){ e.printStackTrace();} 

      return converted_date; 
    } 


    //get the current time zone 

    public String getCurrentTimeZone(){ 
      TimeZone tz = Calendar.getInstance().getTimeZone(); 
      System.out.println(tz.getDisplayName()); 
      return tz.getID(); 
    } 
+0

यह यूटीसी समय देता है, जिसे मैं स्थानीय समय में बदलना चाहता हूं !!!! – ArhatBaid

2

है आधुनिक जावा तारीख & समय API का उपयोग करें, और यह स्पष्ट है:

String inputValue = "2012-08-15T22:56:02.038Z"; 
    Instant timestamp = Instant.parse(inputValue); 
    ZonedDateTime losAngelesTime = timestamp.atZone(ZoneId.of("America/Los_Angeles")); 
    System.out.println(losAngelesTime); 

यह प्रिंट

2012-08-15T15:56:02.038-07:00[America/Los_Angeles] 

अंक नोट करने के लिए:

  • अपनी उम्मीदों में एक छोटे से बग नहीं है। आपके टाइमस्टैम्प में Z का मतलब यूटीसी है, जिसे ज़ुलू समय भी कहा जाता है। तो आपके स्थानीय समय मूल्य में, Z वहां नहीं होना चाहिए। इसके बजाय आप वापसी मूल्य चाहते हैं उदाहरण के लिए 2012-08-15T15:56:02.038-07:00, चूंकि ऑफ़सेट अब Z7
  • के बजाय -7 घंटे है, तो तीन अक्षर समय क्षेत्र संक्षेपों से बचें। वे मानकीकृत नहीं हैं और इसलिए अक्सर अस्पष्ट होते हैं। पीएसटी, उदाहरण के लिए, फिलिपिन मानक समय, प्रशांत मानक समय या पिटकेरेन मानक समय का मतलब हो सकता है (हालांकि संक्षेप में एस गर्मी के समय (जिसका मतलब डीएसटी) होता है)। यदि आप प्रशांत मानक समय का इरादा रखते हैं, तो यह भी समय क्षेत्र नहीं है, क्योंकि गर्मियों में (जहां आपका नमूना टाइमस्टैम्प गिरता है) इसके बजाय प्रशांत डेलाइट टाइम का उपयोग किया जाता है। संक्षेप में इसके कोड में क्षेत्र/शहर प्रारूप में समय क्षेत्र आईडी का उपयोग करें।
  • टाइमस्टैम्प आमतौर पर Instant ऑब्जेक्ट्स के रूप में सबसे अच्छा संभाला जाता है। प्रस्तुति के लिए, जब आपको आवश्यकता हो, केवल ZonedDateTime पर कनवर्ट करें।

प्रश्न: क्या मैं अपने जावा संस्करण के साथ आधुनिक एपीआई का उपयोग कर सकता हूं?

यदि कम से कम जावा का उपयोग कर सकते हैं, तो आप कर सकते हैं।

  • जावा 8 में और बाद में नया एपीआई अंतर्निहित आता है।
  • जावा 6 और 7 में the ThreeTen Backport प्राप्त करें, नए वर्गों का बैकपोर्ट (जो जेएसआर -310 के लिए थ्रीटेन है, जहां आधुनिक एपीआई को पहली बार परिभाषित किया गया था)।
  • एंड्रॉइड पर, थ्रीटेन बैकपोर्ट के एंड्रॉइड संस्करण का उपयोग करें। इसे थ्रीटेनाब कहा जाता है, और मुझे लगता है कि this question: How to use ThreeTenABP in Android Project में एक अद्भुत स्पष्टीकरण है।