2015-06-16 8 views
7

का उपयोग कर कैसे LocalDateTime में समय समय क्षेत्र के आधार बदलने के लिए समय क्षेत्र पर आधारित समय, यहाँ मैं के रूप में ईएसटी समय क्षेत्र के साथ डेट का निर्माण किया है, अब मैं की यूटीसी खोजने की जरूरत है संबंधित समय कृपया मेरी मदद करो इसConvert java.time

String str = "16Jun2015_153556"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ddMMMyyyy_HHmmss"); 
formatter.withZone(ZoneId.of("EST5EDT")); 
LocalDateTime dateTime = LocalDateTime.parse(str, formatter); 
+0

अभिव्यक्ति 'formatter.withZone (ZoneId.of ("ईएसटी 5ईडीटी")); 'बेकार है क्योंकि आप इसे' डेटटाइमफॉर्मेटर 'के किसी भी उदाहरण में असाइन नहीं करते हैं। याद रखें कि यह वर्ग अपरिवर्तनीय है इसलिए सभी परिवर्तनों को प्रतिलिपि करके ही प्राप्त किया जा सकता है, एक ही उदाहरण में हेरफेर नहीं किया जा सकता है। और टाइमज़ोन को इस तरह से सेट करना 'लोकलडेट टाइम' पर पार्सिंग को प्रभावित नहीं करता है (ज़ोन को अनदेखा कर दिया जाएगा)। –

उत्तर

7

इस उत्तर हो सकता है जॉन स्कीट के सही जवाब से किसी भी तरह से अधिक संरचित हो। ऊपर मेरी टिप्पणी में मैंने यह भी बताया है कि DateTimeFormatter की अपरिवर्तनीय प्रकृति को नजरअंदाज न करें, इसलिए कृपया हमेशा उसी प्रकार के चर के साथ "...()" द्वारा उपसर्ग किए गए किसी भी विधि का परिणाम असाइन करें।

// parsing your string input 
// NO!!! timezone is needed in this step because LocalDateTime is just without timezone 
String str = "16Jun2015_153556"; 
DateTimeFormatter formatter = 
    DateTimeFormatter.ofPattern("ddMMMuuuu_HHmmss", Locale.ENGLISH); 
LocalDateTime ldt = LocalDateTime.parse(str, formatter); 

System.out.println(ldt); // your input as java.time-object: 2015-06-16T15:35:56 

फिर आप अपने स्थानीय दिनांक-समय को ईएसटी-जोन में असाइन करते हैं। पुरानी रूप "ईएसटी 5ईडीटी" (जो केवल ऐतिहासिक कच्चे ऑफसेट के इतिहास के बिना निश्चित डीएस नियमों का समर्थन कर रहा है) का उपयोग करने के बजाय आईएएनए-नोटेशन "अमेरिका/न्यू_यॉर्क" का उपयोग करना सुरक्षित है।

ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/New_York")); 

अंत में आप मध्यवर्ती वैश्विक टाइमस्टैम्प वापस एक स्थानीय तारीख-समय पर ऑफसेट UTC + 00 पर बदलना ही शारीरिक समय संरक्षण:

LocalDateTime utc = zdt.withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime(); 
System.out.println(utc); // 2015-06-16T19:35:56 
12

आप के बारे में LocalDateTime की "समय क्षेत्र बदलने" लगता है नहीं करना चाहिए हल करने के लिए कैसे - एक LocalDateTime एक समय क्षेत्र नहीं करता है। इसके बजाय, आपको से ZonedDateTime और एक समय क्षेत्र (ZoneId) बनाना चाहिए। सबसे पहले formatter.withZone कॉल निकालें, तब का उपयोग करें:

ZonedId zone = ZoneId.of("EST5EDT"); // Or preferrably "America/New_York" 
ZonedDateTime zoned = ZonedDateTime.of(dateTime, zone); 

तो फिर तुम एक पल के लिए कि परिवर्तित कर सकते हैं, या शायद का उपयोग करें:

ZonedDateTime utc = zoned.withZoneSameInstant(ZoneOffset.UTC); 

इसलिए उदाहरण के लिए:

import java.time.*; 
import java.time.format.*; 

public class Test { 
    public static void main(String[] args) { 
     String str = "16Jun2015_153556"; 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ddMMMyyyy_HHmmss"); 
     ZoneId zone = ZoneId.of("America/New_York"); 
     LocalDateTime dateTime = LocalDateTime.parse(str, formatter); 
     ZonedDateTime zoned = ZonedDateTime.of(dateTime, zone); 

     // Both of these print 2015-06-16T19:35:56Z 
     System.out.println(zoned.toInstant()); 
     System.out.println(zoned.withZoneSameInstant(ZoneOffset.UTC)); 
    } 
}