tl; डॉ
String sql = "SELECT CURRENT_TIMESTAMP ;
…
OffsetDateTime odt = myResultSet.getObject( 1 , OffsetDateTime.class ) ;
डिफ़ॉल्ट समय क्षेत्र के लिए होस्ट OS या JVM के आधार पर बचें
मैं आपको स्पष्ट रूप से वांछित / अपेक्षित समय क्षेत्र बताने के लिए अपना सारा कोड लिखने की सलाह देता हूं। आपको JVM के वर्तमान डिफ़ॉल्ट समय क्षेत्र पर निर्भर होने की आवश्यकता नहीं है। और ध्यान रखें कि JVM का वर्तमान डिफ़ॉल्ट समय क्षेत्र किसी भी एप्लिकेशन कॉलिंग के किसी भी थ्रेड में किसी भी कोड के साथ, रनटाइम के दौरान किसी भी क्षण बदल सकता है TimeZone.setDefault
। ऐसी कॉल उस JVM के भीतर सभी ऐप्स को तुरंत प्रभावित करती है।
java.time
अन्य उत्तर में से कुछ सही थे, लेकिन अब इसे समाप्त कर दिया गया है। जावा के शुरुआती संस्करणों के साथ बंडल किए गए भयानक तारीख-समय की कक्षाएं त्रुटिपूर्ण थीं, जो उन लोगों द्वारा लिखी गई थीं जो तारीख-समय की हैंडलिंग की जटिलताओं और सूक्ष्मताओं को नहीं समझते थे।
जेएसआर 310 में परिभाषित java.time कक्षाओं द्वारा विरासत की तारीखों के समय को दबा दिया गया है ।
समय क्षेत्र का प्रतिनिधित्व करने के लिए, का उपयोग करें ZoneId
। ऑफ़सेट-यूटीसी का प्रतिनिधित्व करने के लिए, का उपयोग करें ZoneOffset
। एक ऑफसेट प्राइम मेरिडियन के आगे या पीछे घंटे-मिनट-सेकंड की एक संख्या है। एक समय क्षेत्र बहुत अधिक है। एक समय क्षेत्र किसी विशेष क्षेत्र के लोगों द्वारा उपयोग किए जाने वाले ऑफसेट के अतीत, वर्तमान और भविष्य के परिवर्तनों का इतिहास है।
मुझे जीएमटी / यूटीसी को किसी भी समय संबंधित संचालन को बाध्य करने की आवश्यकता है
शून्य घंटे-मिनट-सेकंड की ऑफसेट के लिए, निरंतर का उपयोग करें ZoneOffset.UTC
।
Instant
UTC में वर्तमान क्षण को पकड़ने के लिए, a का उपयोग करें Instant
। यह वर्ग यूटीसी में एक क्षण का प्रतिनिधित्व करता है, हमेशा यूटीसी में परिभाषा के अनुसार।
Instant instant = Instant.now() ; // Capture current moment in UTC.
ZonedDateTime
किसी विशेष क्षेत्र के लोगों द्वारा उपयोग किए जाने वाले दीवार-घड़ी समय के माध्यम से उसी क्षण को देखने के लिए, एक समय क्षेत्र में समायोजित करें। एक ही पल, समय रेखा पर एक ही बिंदु, अलग-अलग दीवार-घड़ी का समय।
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
डेटाबेस
आप एक डेटाबेस का उल्लेख करते हैं।
डेटाबेस से एक पल को पुनः प्राप्त करने के लिए, आपका कॉलम SQL-मानक के समान डेटा प्रकार का होना चाहिए TIMESTAMP WITH TIME ZONE
। एक स्ट्रिंग के बजाय एक वस्तु को पुनः प्राप्त करें। JDBC 4.2 और बाद में, हम डेटाबेस के साथ java.time ऑब्जेक्ट्स का आदान-प्रदान कर सकते हैं । OffsetDateTime
, JDBC के लिए आवश्यक है, जबकि Instant
और ZonedDateTime
वैकल्पिक हैं।
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
अधिकांश डेटाबेस और ड्राइवरों में, मुझे लगता है कि आपको यूटीसी में देखा गया पल मिल जाएगा। लेकिन यदि नहीं, तो आप दो तरीकों से समायोजित कर सकते हैं:
- एक निकालें
Instant
: odt.toInstant()
- दिए गए ऑफ़सेट से शून्य की ऑफ़सेट पर समायोजित करें: ऑफ़सेटडाइट टाइम odtUtc = odt.withOffsetSameInstant (ZoneOffset.UTC); `।
जावा के बारे में
Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date
, Calendar
, और SimpleDateFormat
।
अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है ।
Joda समय परियोजना, अब में रखरखाव मोड , प्रवास करने की सलाह देता java.time कक्षाएं।
आप अपने डेटाबेस से सीधे java.time वस्तुओं का आदान-प्रदान कर सकते हैं । JDBC 4.2 या उसके बाद के JDBC ड्राइवर का अनुपालन करें । तार की कोई जरूरत नहीं, कक्षाओं की कोई जरूरत नहीं ।java.sql.*
Java.time कक्षाएं कहाँ से प्राप्त करें?