tl;डॉ
JPA 2.2 का उपयोग करें java.time . के समर्थन के लिए ।
SQL में केवल-दिनांक मानों के साथ कार्य करने के लिए जावा में केवल दिनांक वाली कक्षा का उपयोग करें।
LocalDate // Represent a date-only, without a time-of-day and without a time zone.
.now( // Get today's date…
ZoneId.of( "Africa/Tunis" ) // …as seen in the wall-clock time used by the people of a particular region.
) // Returns a `LocalDate` object.
.plusMonths( 1 ) // Returns another `LocalDate` object, per immutable objects pattern.
java.time
JPA 2.2 अब आधुनिक java.time . का समर्थन करता है कक्षाएं। अब Joda-Time का उपयोग करने की कोई आवश्यकता नहीं है।
करें नहीं java.sql.Date
. का उपयोग करें . वह वर्ग नाटक करता है केवल दिनांक का प्रतिनिधित्व करने के लिए लेकिन वास्तव में यूटीसी के लिए एक समय-समय पर सेट है क्योंकि भयानक डिजाइन निर्णय java.util.Date
से विरासत में मिला है। (जो नाम के बावजूद और . तारीख का प्रतिनिधित्व करता है दिन का समय और यूटीसी के लिए ही शून्य का ऑफसेट)। ये विरासत वर्ग एक भयानक मनहूस गड़बड़ हैं। सन, ऑरेकल, और जेसीपी समुदाय ने वर्षों पहले जेएसआर 310 को अपनाने के साथ थीसिस कक्षाओं को छोड़ दिया था, और आपको भी ऐसा ही करना चाहिए।
स्थानीय दिनांक
LocalDate
वर्ग दिन के समय के बिना और समय क्षेत्र
के बिना केवल दिनांक मान का प्रतिनिधित्व करता है या offset-from-UTC
।
तिथि निर्धारित करने में एक समय क्षेत्र महत्वपूर्ण है। किसी भी क्षण के लिए, तिथि क्षेत्र के अनुसार दुनिया भर में भिन्न होती है। उदाहरण के लिए, मध्यरात्रि के कुछ मिनट बाद पेरिस फ़्रांस में मॉन्ट्रियल क्यूबेक में "कल" रहते हुए एक नया दिन है ।
यदि कोई समय क्षेत्र निर्दिष्ट नहीं है, तो JVM अपने वर्तमान डिफ़ॉल्ट समय क्षेत्र को निहित रूप से लागू करता है। वह डिफ़ॉल्ट किसी भी क्षण बदलें रनटाइम के दौरान (!), इसलिए आपके परिणाम भिन्न हो सकते हैं। अपने वांछित/अपेक्षित समय क्षेत्र को स्पष्ट रूप से तर्क के रूप में निर्दिष्ट करने के लिए बेहतर है। यदि महत्वपूर्ण हो, तो अपने उपयोगकर्ता के साथ क्षेत्र की पुष्टि करें।
एक उचित समय क्षेत्र नाम
निर्दिष्ट करें महाद्वीप/क्षेत्र
. के प्रारूप में , जैसे अमेरिका/मॉन्ट्रियल
, अफ्रीका/कैसाब्लांका
, या प्रशांत/ऑकलैंड
. कभी भी 2-4 अक्षर के संक्षिप्त नाम का प्रयोग न करें जैसे EST
या आईएसटी
क्योंकि वे नहीं हैं सही समय क्षेत्र, मानकीकृत नहीं, और अद्वितीय भी नहीं (!)।
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
यदि आप JVM के वर्तमान डिफ़ॉल्ट समय क्षेत्र का उपयोग करना चाहते हैं, तो इसके लिए पूछें और तर्क के रूप में पास करें। यदि छोड़ दिया जाता है, तो कोड पढ़ने के लिए अस्पष्ट हो जाता है, हम निश्चित रूप से नहीं जानते कि क्या आप डिफ़ॉल्ट का उपयोग करना चाहते हैं या यदि आप, इतने सारे प्रोग्रामर की तरह, इस मुद्दे से अनजान थे।
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
या कोई तिथि निर्दिष्ट करें। आप जनवरी-दिसंबर के लिए 1-12 की समझदार संख्या के साथ महीने को एक संख्या से सेट कर सकते हैं।
LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ; // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
या, बेहतर है, माह<का उपयोग करें /कोड>
एनम ऑब्जेक्ट्स पूर्व-परिभाषित, वर्ष के प्रत्येक महीने के लिए एक। युक्ति:इन माह
का उपयोग करें आपके कोड को अधिक स्व-दस्तावेज बनाने, मान्य मान सुनिश्चित करने, और प्रकार-सुरक्षा
. वर्ष
के लिए ठीक वैसा ही
&YearMonth
।
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
तारीख-समय गणित
जाहिरा तौर पर आप एक तारीख से शुरू करना चाहते हैं और एक महीने बाद एक तारीख सीमा के रूप में प्राप्त करना चाहते हैं।
LocalDate monthLater = ld.plusMonths( 1 ) ;
JDBC 4.2
JDBC 4.2 के अनुसार, आपके JDBC ड्राइवर को कुछ कुंजी java.time का समर्थन करना आवश्यक है। LocalDate
. जैसी कक्षाएं .
दिनांक-सीमा
तीन-दस-अतिरिक्त . के लिए नीचे दिए गए लिंक पर ध्यान दें . आपको LocalDateRange
. मिल सकता है यदि आप दिनांक सीमाओं के साथ बहुत अधिक कार्य करते हैं तो कक्षा आपके लिए उपयोगी होगी।
के बारे में java.time
java.time उन्हें>
फ्रेमवर्क जावा 8 और बाद में बनाया गया है। ये कक्षाएं पुराने विरासत
की जगह लेती हैं दिनांक-समय की कक्षाएं जैसे java. उपयोग दिनांक
, कैलेंडर
, और SimpleDateFormat
।
अधिक जानने के लिए, Oracle Tutorial देखें . और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें। विशिष्टता है JSR 310 ।
जोडा-टाइम प्रोजेक्ट, अब रखरखाव मोड में , java.time<में माइग्रेशन की सलाह देता है /ए> कक्षाएं।
आप java.time . का आदान-प्रदान कर सकते हैं अपने डेटाबेस के साथ सीधे वस्तुओं। JDBC ड्राइवर
का उपयोग करें JDBC 4.2
के अनुरूप या बाद में। स्ट्रिंग्स की कोई आवश्यकता नहीं है, java.sql.*
. की कोई आवश्यकता नहीं है कक्षाएं।
java.time कक्षाएं कहाँ से प्राप्त करें?
- जावा एसई 8
, Java SE 9
, Java SE 10
, Java SE 11
, और बाद में - बंडल कार्यान्वयन के साथ मानक जावा एपीआई का हिस्सा।
- Java 9 में कुछ छोटी सुविधाएँ और सुधार शामिल हैं।
- जावा एसई 6
और Java SE 7
- अधिकांश java.time कार्यक्षमता को ThreeTen-Backport में Java 6 और 7 में बैक-पोर्ट किया गया है ।
- एंड्रॉयड
- java.time . के Android बंडल कार्यान्वयन के बाद के संस्करण कक्षाएं।
- पहले वाले Android (<26) के लिए, ThreeTenABP परियोजना अनुकूलन ThreeTen-Backport (उपर्युक्त)। देखें ThreeTenABP का उपयोग कैसे करें… ।
ThreeTen-Extra
परियोजना अतिरिक्त कक्षाओं के साथ java.time का विस्तार करती है। यह परियोजना java.time में संभावित भावी परिवर्धन के लिए एक सिद्ध आधार है। आपको यहां कुछ उपयोगी कक्षाएं मिल सकती हैं जैसे अंतराल
, YearWeek
, YearQuarter
, और अधिक
।