tl; डॉ
- उपयोग java.time विरासत
java.util.Date
& JDBC 4.2 या बाद के साथ java.sql.Date
के बजाय वर्गों।
- जावा के समय में कनवर्ट करें यदि कोड के साथ इंटर-ऑपरेटिंग अभी तक 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.
)
विवरण
आप तारीख-केवल मूल्यों (कोई समय दिन-का-, कोई समय क्षेत्र) के साथ काम करने की कोशिश कर रहे हैं, तो java.util.Date
बजाय LocalDate
वर्ग का उपयोग करें।
java.time
जावा 8 में और बाद में, परेशानी पुराने तिथि-समय जावा के प्रारंभिक संस्करणों के साथ बंडल कक्षाएं नए java.time package द्वारा का स्थान ले लिया गया है। Oracle Tutorial देखें। अधिकांश कार्यक्षमता को जावा 6 & 7 में ThreeTen-Backport में बैक-पोर्ट किया गया है और आगे ThreeTenABP में एंड्रॉइड को अनुकूलित किया गया है।
ए SQL data typeDATE
केवल तारीख के लिए, समय-समय पर और समय क्षेत्र के साथ ही होना चाहिए। जावा 8 में java.time.LocalDate
तक जावा इतनी कक्षा कभी नहीं थी। चलिए आज की तारीख को किसी विशेष समय क्षेत्र के अनुसार प्राप्त करके इस तरह का मूल्य बनाते हैं (मॉन्ट्रियल की तुलना में पेरिस में पहले एक नए दिन के रूप में दिनांक निर्धारित करने में समय क्षेत्र महत्वपूर्ण है, उदाहरण के लिए)।
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 driverJDBC 4.2 spec का अनुपालन करता है, तो आपको LocalDate
setObject
पर SQL दिनांक फ़ील्ड में संग्रहीत करने में सक्षम होना चाहिए।
myPreparedStatement.setObject(1 , localDate);
इसी तरह, ResultSet::getObject
का प्रयोग कर एक जावा LocalDate
ऑब्जेक्ट में एक एसक्यूएल तिथि कॉलम से ला नहीं सके। दूसरे तर्क में कक्षा निर्दिष्ट करना आपका कोड type-safe बनाता है।
LocalDate localDate = ResultSet.getObject(1 , LocalDate.class);
दूसरे शब्दों में, इस पूरे प्रश्न या बाद में JDBC 4.2 के तहत अप्रासंगिक है।
यदि आपका जेडीबीसी ड्राइवर इस तरीके से प्रदर्शन नहीं करता है, तो आपको java.sql प्रकारों में कनवर्ट करने के लिए वापस गिरने की आवश्यकता है।
, java.sql.Date
में बदलें परिवर्तित करने के लिए नए तरीकों वर्ष तिथि-समय वर्गों को जोड़ा गया का उपयोग करें। LocalDate
को परिवर्तित करने के लिए हम java.sql.Date.valueOf(…)
पर कॉल कर सकते हैं।
java.sql.Date sqlDate = java.sql.Date.valueOf(todayLocalDate);
और दूसरी दिशा में जा रहा है।
LocalDate localDate = sqlDate.toLocalDate();
से java.util.Date
परिवर्तित आप पुराने तिथि-समय वर्गों का उपयोग करने से बचना चाहिए, तब तक आप जब मौजूदा कोड के साथ काम करने के लिए मजबूर किया जा सकता है। यदि ऐसा है, तो आप java.time से/में कनवर्ट कर सकते हैं।
Instant
कक्षा के माध्यम से जाएं, जो यूटीसी में समयरेखा पर एक पल का प्रतिनिधित्व करता है। एक Instant
java.util.Date
के विचार में समान है। लेकिन ध्यान दें कि Instant
में nanoseconds तक एक संकल्प है जबकि java.util.Date
में केवल milliseconds संकल्प है।
परिवर्तित करने के लिए, पुराने वर्गों में जोड़े गए नए तरीकों का उपयोग करें। उदाहरण के लिए, java.util.Date.from(Instant)
और java.util.Date::toInstant
।
Instant instant = myUtilDate.toInstant();
दिनांक निर्धारित करने के लिए, हमें समय क्षेत्र के संदर्भ की आवश्यकता है। किसी भी क्षण के लिए, समय क्षेत्र द्वारा तिथि दुनिया भर में बदलती है। ZonedDateTime
प्राप्त करने के लिए ZoneId
लागू करें।
ZoneId zoneId = ZoneId.of ("America/Montreal");
ZonedDateTime zdt = ZonedDateTime.ofInstant (instant , zoneId);
LocalDate localDate = zdt.toLocalDate();
† java.sql.Date वर्ग तारीख-केवल एक समय दिन-का-बिना होने का दिखावा लेकिन वास्तव में एक समय के दिन, एक आधी रात के समय के लिए समायोजित करता है। भ्रामक? हां, पुराने डेट-टाइम क्लासेस एक गड़बड़ हैं।
आप ने वही समस्या यहां पा सकते हैं JXDatePicker की वस्तु है http://stackoverflow.com/questions/12131068/error-casting-java-util-date -into-java-sql-date – Lem
मेरे लिए, यह निकला कि मुझे बदलने के लिए जरूरी नहीं था। मेरे कोड में एक 'आयात java.sql। * 'था, java.util.date को ओवरराइड करना और इस प्रकार दिनांक मूल्यों को असाइन करते समय परेशानी उत्पन्न हुई जो बाद वाले के साथ ठीक थी लेकिन पहले नहीं। एचटीएच – HumanInDisguise
@ डेविड एकरमैन क्या आप समझते हैं कि एक java.util.Date एक तारीख * और * एक दिन का दिन है, लेकिन एक java.sql.Date केवल एक तारीख * बिना * दिन है? (असल में समय-समय पर होता है लेकिन इसे अनदेखा किया जाता है, क्लास डिज़ाइन का खराब हैक) एसक्यूएल में, 'DATE' का मतलब केवल दिनांक है। –