tl; डॉ
Java.util को कैसे बदलें। java.sql.Date को कैसे बदलें?
मत करो। दोनों ही वर्ग बहिष्कृत हैं।
- विरासत के बजाय jD.time कक्षाओं का उपयोग करें
java.util.Date
और java.sql.Date
JDBC 4.2 या उसके बाद के साथ।
- / से java.time में कनवर्ट करें यदि कोड के साथ इंटर-संचालन अभी तक java.time पर अपडेट नहीं किया गया है।
उदाहरण के साथ क्वेरी PreparedStatement
।
myPreparedStatement.setObject(
… , // Specify the ordinal number of which argument in SQL statement.
myJavaUtilDate.toInstant() // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC).
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`.
.toLocalDate() // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object.
)
प्रतिस्थापन:
Instant
java.util.Date
दोनों के बजाय UTC में एक पल का प्रतिनिधित्व करते हैं। लेकिन अब मिलीसेकंड के बजाय नैनोसेकंड के साथ।
LocalDate
java.sql.Date
दोनों के बजाय दिन के समय के बिना और समय क्षेत्र के बिना केवल तारीख का प्रतिनिधित्व करते हैं।
विवरण
यदि आप दिनांक-केवल मान (कोई समय-दिन, कोई समय क्षेत्र नहीं) के साथ काम करने का प्रयास कर रहे हैं, तो LocalDate
कक्षा का उपयोग करें java.util.Date
।
java.time
जावा 8 और बाद में, जावा के शुरुआती संस्करणों के साथ बंडल किए गए परेशान पुराने दिनांक-समय वर्गों को नए जावा.टाइम पैकेज द्वारा दबा दिया गया है । ओरेकल ट्यूटोरियल देखें । कार्यक्षमता की ज्यादातर में जावा 6 और 7 को वापस भेजा जा चुका है ThreeTen-backport और आगे में एंड्रॉयड के लिए अनुकूलित ThreeTenABP ।
एक SQL डेटा प्रकार DATE
केवल दिनांक के लिए होता है, जिसमें कोई समय नहीं होता है और कोई समय क्षेत्र नहीं होता है। जावा में कभी भी ऐसी कक्षा a तक नहीं थी java.time.LocalDate
create जब तक कि जावा में create नहीं है। आइए एक विशेष समय क्षेत्र के अनुसार आज की तारीख प्राप्त करके ऐसा मान बनाएं (समय क्षेत्र एक तिथि निर्धारित करने में महत्वपूर्ण है क्योंकि मॉन्ट्रियल की तुलना में पहले पेरिस में एक नए दिन की शुरुआत होती है) उदाहरण)।
LocalDate todayLocalDate = LocalDate.now( ZoneId.of( "America/Montreal" ) ); // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST".
इस बिंदु पर, हम हो सकते हैं। अपने तो JDBC ड्राइवर के साथ अनुपालन JDBC 4.2 कल्पना , आप एक पारित करने के लिए सक्षम होना चाहिए LocalDate
के माध्यम से setObject
एक पर PreparedStatement
एक एसक्यूएल, DATE क्षेत्र में दुकान करने के लिए।
myPreparedStatement.setObject( 1 , localDate );
इसी तरह, ResultSet::getObject
SQL DATE कॉलम से जावा LocalDate
ऑब्जेक्ट तक लाने के लिए उपयोग करें । दूसरे तर्क में कक्षा को निर्दिष्ट करना आपके कोड को सुरक्षित बनाता है ।
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
दूसरे शब्दों में, यह पूरा प्रश्न JDBC 4.2 या उसके बाद के लिए अप्रासंगिक है ।
यदि आपका JDBC ड्राइवर इस तरीके से प्रदर्शन नहीं करता है, तो आपको java.sql प्रकारों में कनवर्ट करने के लिए वापस जाने की आवश्यकता है।
Java.sql.Date में कनवर्ट करें
परिवर्तित करने के लिए, पुराने दिनांक-समय वर्गों में जोड़े गए नए तरीकों का उपयोग करें। हम java.sql.Date.valueOf(…)
एक कन्वर्ट करने के लिए कॉल कर सकते हैं LocalDate
।
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
और दूसरी दिशा में जा रहा है।
LocalDate localDate = sqlDate.toLocalDate();
से परिवर्तित कर रहा है java.util.Date
जबकि आपको पुरानी डेट-टाइम कक्षाओं का उपयोग करने से बचना चाहिए, आपको मौजूदा कोड के साथ काम करने के लिए मजबूर किया जा सकता है। यदि हां, तो आप java.time से / में परिवर्तित कर सकते हैं।
Instant
कक्षा के माध्यम से जाएं , जो यूटीसी में समय पर एक क्षण का प्रतिनिधित्व करता है। एक Instant
विचार में एक के समान है java.util.Date
। लेकिन ध्यान दें कि नैनोसेकंडInstant
तक रिज़ॉल्यूशन होता है जबकि केवल मिलीसेकंड होता हैjava.util.Date
रिज़ॉल्यूशन होता है।
परिवर्तित करने के लिए, पुरानी कक्षाओं में जोड़े गए नए तरीकों का उपयोग करें। उदाहरण के लिए, java.util.Date.from( Instant )
और java.util.Date::toInstant
।
Instant instant = myUtilDate.toInstant();
एक तिथि निर्धारित करने के लिए, हमें एक समय क्षेत्र के संदर्भ की आवश्यकता है। किसी भी क्षण के लिए, तिथि समय क्षेत्र के अनुसार दुनिया भर में बदलती रहती है। ZoneId
पाने के लिए एक लागू करें ZonedDateTime
।
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
Pret java.sql.Date वर्ग केवल समय के बिना तारीख होने का दिखावा करता है, लेकिन वास्तव में एक दिन का समय करता है, जिसे आधी रात के समय के साथ समायोजित किया जाता है। भ्रमित? हां, पुराने डेट-टाइम क्लासेज गड़बड़ हैं।
जावा के बारे में
Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date
, Calendar
, औरSimpleDateFormat
।
Joda समय परियोजना, अब में रखरखाव मोड , प्रवास करने की सलाह देता java.time कक्षाएं।
अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है ।
आप अपने डेटाबेस से सीधे java.time वस्तुओं का आदान-प्रदान कर सकते हैं । JDBC 4.2 या उसके बाद के JDBC ड्राइवर का अनुपालन करें । तार की कोई जरूरत नहीं, कक्षाओं की कोई जरूरत नहीं ।java.sql.*
Java.time कक्षाएं कहाँ से प्राप्त करें?
ThreeTen-अतिरिक्त परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के लिए भविष्य के संभावित अतिरिक्त के लिए एक साबित जमीन है। आप यहाँ कुछ उपयोगी वर्गों जैसे मिल सकता है Interval
, YearWeek
, YearQuarter
, और अधिक ।