tl; डॉ
Instant
और LocalDateTime
दो पूरी तरह से अलग जानवर हैं: एक एक पल का प्रतिनिधित्व करता है, दूसरा नहीं करता है।
Instant
समय में एक विशिष्ट बिंदु का प्रतिनिधित्व करता है।
LocalDateTime
एक तारीख और दिन के समय का प्रतिनिधित्व करता है। लेकिन समय क्षेत्र या ऑफ़सेट-यूटीसी की कमी के कारण, यह वर्ग एक पल का प्रतिनिधित्व नहीं कर सकता है । यह लगभग 26 से 27 घंटे की सीमा के साथ संभावित क्षणों का प्रतिनिधित्व करता है , दुनिया भर के सभी समय क्षेत्रों की सीमा।
गलत अनुमान
LocalDateTime
मनुष्यों के लिए समय-क्षेत्र सहित तारीख / घड़ी प्रतिनिधित्व है।
आपका कथन गलत है: A LocalDateTime
का कोई समय क्षेत्र नहीं है । कोई समय क्षेत्र नहीं होने से उस वर्ग का पूरा बिंदु है।
उस वर्ग को उद्धृत करने के लिए 'डॉक्टर:
यह वर्ग किसी समय-क्षेत्र को संग्रहीत या प्रस्तुत नहीं करता है। इसके बजाय, यह तिथि का वर्णन है, जैसा कि जन्मदिन के लिए उपयोग किया जाता है, स्थानीय समय के साथ संयुक्त रूप से एक दीवार घड़ी पर देखा जाता है। यह ऑफ़सेट या टाइम-ज़ोन जैसी अतिरिक्त जानकारी के बिना समय-रेखा पर एक पल का प्रतिनिधित्व नहीं कर सकता है।
तो Local…
इसका मतलब है "ज़ोनड नहीं, ऑफ़सेट"।
Instant
एक Instant
में समय रेखा पर एक पल है यूटीसी , की गिनती नैनोसेकंड 1970 यूटीसी (मूल रूप से, बुनियादी तथ्य जानकारी के लिए वर्ग दस्तावेज़ नहीं देख) के पहले पल की अवधि के बाद। चूंकि आपके अधिकांश व्यावसायिक तर्क, डेटा संग्रहण और डेटा विनिमय UTC में होना चाहिए, इसलिए यह अक्सर उपयोग किए जाने वाला एक आसान वर्ग है।
Instant instant = Instant.now() ; // Capture the current moment in UTC.
OffsetDateTime
क्लास OffsetDateTime
क्लास यूटीसी के आगे या पीछे कुछ घंटों-मिनटों की संख्या के संदर्भ में एक तारीख और समय के रूप में एक क्षण का प्रतिनिधित्व करता है। ऑफ़सेट की मात्रा, घंटे-मिनट-सेकंड की संख्या, ZoneOffset
वर्ग द्वारा दर्शायी जाती है।
यदि घंटे-मिनट-सेकंड की संख्या शून्य है, तो OffsetDateTime
UTC में एक क्षण को एक के रूप में दर्शाता है Instant
।
ZoneOffset
ZoneOffset
वर्ग का प्रतिनिधित्व करता है एक ऑफसेट-यूटीसी से , यूटीसी के आगे या पीछे यूटीसी घंटे मिनट सेकंड के एक नंबर।
A ZoneOffset
केवल घंटे-मिनट-सेकंड की एक संख्या है, अधिक कुछ नहीं। एक क्षेत्र बहुत अधिक है, एक नाम है और ऑफसेट करने के लिए परिवर्तनों का इतिहास है। इसलिए एक क्षेत्र का उपयोग करना हमेशा एक मात्र ऑफसेट का उपयोग करना बेहतर होता है।
ZoneId
एक समय क्षेत्र को ZoneId
कक्षा द्वारा दर्शाया जाता है ।
एक नया दिन पेरिस में मॉन्ट्रियल की तुलना में पहले का है , उदाहरण के लिए। इसलिए हमें किसी दिए गए क्षेत्र के लिए दोपहर (जब सूर्य सीधे ऊपर की ओर है) को बेहतर ढंग से प्रतिबिंबित करने के लिए घड़ी के हाथों को स्थानांतरित करने की आवश्यकता है। पश्चिम यूरोप / अफ्रीका में UTC लाइन से आगे की ओर पूर्व / पश्चिम की ओर बड़ा ऑफ़सेट है।
एक समय क्षेत्र स्थानीय समुदाय या क्षेत्र द्वारा अभ्यास के रूप में समायोजन और विसंगतियों से निपटने के लिए नियमों का एक समूह है। सबसे आम विसंगति सभी-बहुत-लोकप्रिय चंचलता है जिसे डेलाइट सेविंग टाइम (डीएसटी) के रूप में जाना जाता है ।
एक समय क्षेत्र में पिछले नियमों, वर्तमान नियमों और निकट भविष्य के लिए पुष्टि किए गए नियमों का इतिहास है।
ये नियम आपकी अपेक्षा से अधिक बार बदलते हैं। अपने दिनांक-समय लायब्रेरी के नियमों को रखना सुनिश्चित करें, आमतौर पर 'tz' डेटाबेस की एक प्रति , अप टू डेट। ओरेकल को टाइमज़ोन अपडेटर टूल जारी करने के साथ जावा 8 में अब तक अप-टू-डेट रखना आसान है ।
के रूप में , या , के प्रारूप में एक उचित समय क्षेत्र नाम निर्दिष्ट करें । कभी इस तरह के रूप में 2-4 पत्र संक्षिप्त नाम का उपयोग या के रूप में वे कर रहे हैं नहीं सच समय क्षेत्र, नहीं मानकीकृत, और यहां तक कि अद्वितीय नहीं (!)।Continent/Region
America/Montreal
Africa/Casablanca
Pacific/Auckland
EST
IST
समय क्षेत्र = समायोजन का समायोजन + नियम
ZoneId z = ZoneId.of( “Africa/Tunis” ) ;
ZonedDateTime
एक सौंपा के साथ के ZonedDateTime
रूप में वैचारिक रूप से सोचो ।Instant
ZoneId
ZonedDateTime = (झटपट + जोनआईड)
एक विशेष क्षेत्र (एक समय क्षेत्र) के लोगों द्वारा उपयोग की जाने वाली दीवार-घड़ी के समय में देखे गए वर्तमान क्षण को पकड़ने के लिए:
ZonedDateTime zdt = ZonedDateTime.now( z ) ; // Pass a `ZoneId` object such as `ZoneId.of( "Europe/Paris" )`.
आपके सभी बैकएंड, डेटाबेस, व्यावसायिक तर्क, डेटा दृढ़ता, डेटा विनिमय सभी लगभग UTC में होने चाहिए। लेकिन उपयोगकर्ताओं को प्रस्तुति के लिए आपको उपयोगकर्ता द्वारा अपेक्षित समय क्षेत्र में समायोजित करने की आवश्यकता होती है। यह ZonedDateTime
कक्षा का उद्देश्य है और उन तारीख-समय के मूल्यों के स्ट्रिंग अभ्यावेदन उत्पन्न करने के लिए उपयोग किए जाने वाले फॉर्मेट क्लास हैं।
ZonedDateTime zdt = instant.atZone( z ) ;
String output = zdt.toString() ; // Standard ISO 8601 format.
आप स्थानीय स्वरूप में पाठ का उपयोग कर उत्पन्न कर सकते हैं DateTimeFormatter
।
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( Locale.CANADA_FRENCH ) ;
String outputFormatted = zdt.format( f ) ;
मर्डी 30 एवरिल 2019 आ 23 एच 22 मिनट 55 सेकेंड हेअर डे'इंड
LocalDate
, LocalTime
,LocalDateTime
"स्थानीय" दिनांक समय कक्षाएं, LocalDateTime
, LocalDate
, LocalTime
, जीव का एक अलग तरह की हैं। किसी एक इलाके या समय क्षेत्र से बंधे नहीं हैं। वे टाइमलाइन से बंधे नहीं हैं। जब तक आप उन्हें किसी इलाके में समय रेखा पर बिंदु खोजने के लिए लागू नहीं करते हैं, तब तक उनका कोई वास्तविक अर्थ नहीं है।
इन वर्ग नामों में "स्थानीय" शब्द, बिना पढ़े लिखे के लिए सहज हो सकता है। शब्द का अर्थ किसी भी इलाके या हर इलाके से है, लेकिन किसी खास इलाके से नहीं ।
इसलिए व्यावसायिक ऐप्स के लिए, "स्थानीय" प्रकार का अक्सर उपयोग नहीं किया जाता है क्योंकि वे संभावित तिथि के सामान्य विचार का प्रतिनिधित्व करते हैं या समयरेखा पर एक विशिष्ट क्षण नहीं। व्यवसाय के ऐप्स ठीक उसी क्षण की परवाह करते हैं जब एक चालान आया, परिवहन के लिए भेजा गया एक उत्पाद, एक कर्मचारी को काम पर रखा गया था, या टैक्सी ने गैरेज छोड़ दिया था। इसलिए व्यवसाय ऐप डेवलपर सबसे अधिक उपयोग करते हैं Instant
और ZonedDateTime
कक्षाएं लगाते हैं।
तो हम कब इस्तेमाल करेंगे LocalDateTime
? तीन स्थितियों में: जहां हम कई स्थानों पर एक निश्चित तिथि और समय-दिन लागू करना चाहते हैं, जहां हम अपॉइंटमेंट बुक कर रहे हैं, या जहां हमारा अभी तक अनिर्धारित समय क्षेत्र है। ध्यान दें कि इन तीनों मामलों में से कोई भी समय रेखा पर एक निश्चित विशिष्ट बिंदु नहीं है, इनमें से कोई भी एक क्षण नहीं है।
एक समय का, कई पल का
कभी-कभी हम एक निश्चित तिथि पर दिन के एक निश्चित समय का प्रतिनिधित्व करना चाहते हैं, लेकिन इसे समय क्षेत्र में कई इलाकों में लागू करना चाहते हैं।
उदाहरण के लिए, "क्रिसमस 25 दिसंबर 2015 की आधी रात को शुरू होता है" LocalDateTime
। मोंटेरे की तुलना में पेरिस में अलग-अलग क्षणों में आधी रात की हड़ताल, और सिएटल और ऑकलैंड में फिर से अलग ।
LocalDate ld = LocalDate.of( 2018 , Month.DECEMBER , 25 ) ;
LocalTime lt = LocalTime.MIN ; // 00:00:00
LocalTime ldt = LocalDateTime.of( ld , lt ) ; // Xmas morning anywhere.
एक अन्य उदाहरण, "एक्मे कंपनी की एक नीति है कि दोपहर का खाना दुनिया भर में इसके प्रत्येक कारखाने में दोपहर 12:30 बजे शुरू होता है" LocalTime
। वास्तविक अर्थ रखने के लिए आपको स्टटगार्ट कारखाने में 12:30 या रबात कारखाने में 12:30 या सिडनी कारखाने में 12:30 का समय निर्धारित करने के लिए इसे समय पर लागू करना होगा ।
नियुक्तियों की बुकिंग
LocalDateTime
भविष्य की घटनाओं की बुकिंग के लिए उपयोग करने के लिए एक और स्थिति है (उदा: डेंटिस्ट नियुक्तियों)। ये नियुक्तियां भविष्य में काफी दूर हो सकती हैं जो आप नेताओं को समय क्षेत्र को फिर से परिभाषित करने का जोखिम उठाते हैं। राजनेता अक्सर बहुत कम पूर्वाभास देते हैं, या फिर कोई चेतावनी भी नहीं देते हैं। यदि आप "23 जनवरी 23 जनवरी को अगले दिन" का अर्थ यह समझते हैं कि राजनेता घड़ी के साथ कैसे खेल सकते हैं, तो आप एक क्षण भी रिकॉर्ड नहीं कर सकते हैं - यदि उस क्षेत्र को अपनाया गया है या गिरा दिया गया है तो 3 पीएम 2 पीएम या 4 पीएम में बदल जाएगा। उदाहरण के लिए।
नियुक्तियों के लिए, LocalDateTime
a ZoneId
, a को अलग से रखें। बाद में, शेड्यूल जनरेट करते समय, ऑन-द-फ्लाई LocalDateTime::atZone( ZoneId )
किसी ZonedDateTime
ऑब्जेक्ट को जेनरेट करने के लिए कॉल करके एक क्षण का निर्धारण करता है ।
ZonedDateTime zdt = ldt.atZone( z ) ; // Given a date, a time-of-day, and a time zone, determine a moment, a point on the timeline.
यदि आवश्यक हो, तो आप यूटीसी को समायोजित कर सकते हैं। एक उद्धरण Instant
से ZonedDateTime
।
Instant instant = zdt.toInstant() ; // Adjust from some zone to UTC. Same moment, same point on the timeline, different wall-clock time.
अज्ञात क्षेत्र
कुछ लोग LocalDateTime
ऐसी स्थिति में उपयोग कर सकते हैं जहां समय क्षेत्र या ऑफसेट अज्ञात है।
मैं इस मामले को अनुचित और नासमझ मानता हूं। यदि कोई ज़ोन या ऑफ़सेट इरादा है, लेकिन अनिर्धारित है, तो आपके पास खराब डेटा है। यह एक उत्पाद की कीमत को बिना किसी इच्छित मुद्रा के भंडारण के समान होगा। अच्छा विचार नहीं।
सभी दिनांक-समय प्रकार
पूर्णता के लिए, यहां जावा में आधुनिक और विरासत दोनों के साथ-साथ SQL मानक द्वारा परिभाषित सभी संभावित तिथि-समय प्रकारों की एक तालिका है। इससे Instant
& LocalDateTime
कक्षाओं को बड़े संदर्भ में रखने में मदद मिल सकती है।
JDBC 4.2 को डिजाइन करने में जावा टीम द्वारा किए गए अजीब विकल्पों पर ध्यान दें। वे सभी का समर्थन करने का फैसला किया java.time बार ... दो सबसे अधिक इस्तेमाल वर्गों के लिए छोड़कर: Instant
और ZonedDateTime
।
लेकिन चिंता करने की नहीं। हम आसानी से आगे-पीछे कर सकते हैं।
परिवर्तित करना Instant
।
// Storing
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
myPreparedStatement.setObject( … , odt ) ;
// Retrieving
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Instant instant = odt.toInstant() ;
परिवर्तित करना ZonedDateTime
।
// Storing
OffsetDateTime odt = zdt.toOffsetDateTime() ;
myPreparedStatement.setObject( … , odt ) ;
// Retrieving
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = odt.atZone( z ) ;
जावा के बारे में
Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date
, Calendar
, और SimpleDateFormat
।
अब जोडा-टाइम परियोजना, रखरखाव मोड में , java.time कक्षाओं में प्रवासन की सलाह देती है ।
अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है ।
आप अपने डेटाबेस से सीधे java.time वस्तुओं का आदान-प्रदान कर सकते हैं । JDBC 4.2 या उसके बाद के JDBC ड्राइवर का अनुपालन करें । तार की कोई जरूरत नहीं, कक्षाओं की कोई जरूरत नहीं ।java.sql.*
Java.time कक्षाएं कहाँ से प्राप्त करें?
ThreeTen-अतिरिक्त परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के लिए भविष्य के संभावित अतिरिक्त के लिए एक साबित जमीन है। आप यहाँ कुछ उपयोगी वर्गों जैसे मिल सकता है Interval
, YearWeek
, YearQuarter
, और अधिक ।