संक्षिप्त जवाब:
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
समय-रेखा पर एक तात्कालिक का प्रतिनिधित्व करता है, न कि एक "तारीख"। ऑब्जेक्ट के भीतर संग्रहीत वास्तविक डेटा long
1970-01-01T00: 00Z (1970 GMT / UTC की शुरुआत में मध्यरात्रि) के बाद से मिलीसेकंड की गणना है।
java.util.Date
JSR-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.Date
15 अक्टूबर 1582 को एक कैलेंडर का उपयोग करता है, इससे पहले की तारीखों के साथ जूलियन एक के बजाय जूलियन कैलेंडर का उपयोग करता है। इसके विपरीत, java.time.*
हर समय के लिए आईएसओ कैलेंडर प्रणाली (ग्रेगोरियन के बराबर) का उपयोग करता है। अधिकांश उपयोग के मामलों में, आईएसओ कैलेंडर प्रणाली वही है जो आप चाहते हैं, लेकिन वर्ष 1582 से पहले की तारीखों की तुलना करते समय आपको अजीब प्रभाव दिखाई दे सकते हैं।