संक्षिप्त जवाब:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
स्पष्टीकरण: ( इस बारे में इस सवाल पर आधारित LocalDate)
अपने नाम के बावजूद, java.util.Dateसमय-रेखा पर एक तात्कालिक का प्रतिनिधित्व करता है, न कि एक "तारीख"। ऑब्जेक्ट के भीतर संग्रहीत वास्तविक डेटा long1970-01-01T00: 00Z (1970 GMT / UTC की शुरुआत में मध्यरात्रि) के बाद से मिलीसेकंड की गणना है।
java.util.DateJSR-310 में समतुल्य वर्ग है Instant, इस प्रकार रूपांतरण और फ्रॉस्ट प्रदान करने के लिए सुविधाजनक तरीके हैं:
Date input = new Date();
Instant instant = input.toInstant();
Date output = Date.from(instant);
एक java.util.Dateउदाहरण में समय-क्षेत्र की कोई अवधारणा नहीं है। यदि आप कॉल toString()करते हैं तो यह अजीब लग सकता है java.util.Date, क्योंकि यह toStringसमय-क्षेत्र के सापेक्ष है। हालाँकि वह विधि वास्तव में स्ट्रिंग प्रदान करने के लिए मक्खी पर जावा के डिफ़ॉल्ट टाइम-ज़ोन का उपयोग करती है। समय-क्षेत्र वास्तविक स्थिति का हिस्सा नहीं है java.util.Date।
एक Instantभी समय क्षेत्र के बारे में कोई जानकारी नहीं है। इस प्रकार, Instantकिसी स्थानीय दिनांक-समय से परिवर्तित करने के लिए समय-क्षेत्र निर्दिष्ट करना आवश्यक है। यह डिफ़ॉल्ट क्षेत्र हो सकता है - ZoneId.systemDefault()- या यह एक समय-क्षेत्र हो सकता है जो आपके एप्लिकेशन को नियंत्रित करता है, जैसे उपयोगकर्ता वरीयताओं से समय-क्षेत्र। LocalDateTimeएक सुविधाजनक कारखाना विधि है जो तत्काल और समय-क्षेत्र दोनों को ले जाती है:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
रिवर्स में, LocalDateTimeसमय-क्षेत्र atZone(ZoneId)विधि को कॉल करके निर्दिष्ट किया जाता है । ZonedDateTimeफिर एक के लिए सीधे परिवर्तित किया जा सकता Instant:
LocalDateTime ldt = ...
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
Date output = Date.from(zdt.toInstant());
नोट से रूपांतरण है कि LocalDateTimeकरने के लिए ZonedDateTimeअनपेक्षित व्यवहार शुरू करने की क्षमता है। ऐसा इसलिए है क्योंकि डेलाइट सेविंग टाइम के कारण हर स्थानीय तिथि-समय मौजूद नहीं है। शरद ऋतु / गिरावट में, स्थानीय समय-रेखा में एक ओवरलैप होता है जहां एक ही स्थानीय तिथि-समय दो बार होता है। वसंत में, एक अंतराल है, जहां एक घंटे गायब हो जाता है। atZone(ZoneId)रूपांतरण क्या करेगा की अधिक परिभाषा के लिए Javadoc देखें ।
सारांश, यदि आप राउंड-ट्रिप ए java.util.Dateटू LocalDateTimeऔर बैक java.util.Dateटू यू डेलाइट सेविंग टाइम के कारण एक अलग पल के साथ समाप्त हो सकते हैं।
अतिरिक्त जानकारी: एक और अंतर है जो बहुत पुरानी तारीखों को प्रभावित करेगा। java.util.Date15 अक्टूबर 1582 को एक कैलेंडर का उपयोग करता है, इससे पहले की तारीखों के साथ जूलियन एक के बजाय जूलियन कैलेंडर का उपयोग करता है। इसके विपरीत, java.time.*हर समय के लिए आईएसओ कैलेंडर प्रणाली (ग्रेगोरियन के बराबर) का उपयोग करता है। अधिकांश उपयोग के मामलों में, आईएसओ कैलेंडर प्रणाली वही है जो आप चाहते हैं, लेकिन वर्ष 1582 से पहले की तारीखों की तुलना करते समय आपको अजीब प्रभाव दिखाई दे सकते हैं।