tl; डॉ
… एक स्ट्रिंग से… पार्स किया गया… समय क्षेत्र निर्दिष्ट नहीं है… मैं एक विशिष्ट समय क्षेत्र सेट करना चाहता हूं
LocalDateTime.parse( "2018-01-23T01:23:45.123456789" ) // Parse string, lacking an offset-from-UTC and lacking a time zone, as a `LocalDateTime`.
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Assign the time zone for which you are certain this date-time was intended. Instantiates a `ZonedDateTime` object.
जूडे में नो टाइम जोन
अन्य सही उत्तरों कहा गया है, एक java.util.Date कोई समय क्षेत्र है † । यह UTC / GMT (नो टाइम ज़ोन ऑफ़सेट) का प्रतिनिधित्व करता है । बहुत भ्रामक है क्योंकि इसका toString
तरीका स्ट्रिंग प्रतिनिधित्व प्रस्तुत करते समय जेवीएम के डिफ़ॉल्ट समय क्षेत्र को लागू करता है।
जूडे से बचें
इसके और कई अन्य कारणों के लिए, आपको अंतर्निहित java.util.Date & .Calendar & java.text.SimpleDateFormat का उपयोग करने से बचना चाहिए। वे कुख्यात हैं।
इसके बजाय जावा 8 के साथ बंडल java.time पैकेज का उपयोग करें ।
java.time
Java.time कक्षाएं समय पर तीन तरीकों से एक क्षण का प्रतिनिधित्व कर सकती हैं:
- UTC (
Instant
)
- एक ऑफसेट के
OffsetDateTime
साथ ( साथ ZoneOffset
)
- एक समय क्षेत्र के
ZonedDateTime
साथ ( ZoneId
)
Instant
में java.time , मूल निर्माण खंड है Instant
, UTC में समय रेखा पर एक पल। Instant
अपने व्यावसायिक तर्क के लिए वस्तुओं का उपयोग करें ।
Instant instant = Instant.now();
OffsetDateTime
कुछ इलाके की दीवार-घड़ी के समय में समायोजित करने के लिए एक ऑफसेट-यू-यूटीसी लागू करें ।
ZoneOffset
पाने के लिए एक लागू करें OffsetDateTime
।
ZoneOffset zoneOffset = ZoneOffset.of( "-04:00" );
OffsetDateTime odt = OffsetDateTime.ofInstant( instant , zoneOffset );
ZonedDateTime
बेहतर है कि एक टाइम ज़ोन लागू किया जाए , एक ऑफसेट प्लस जैसे कि डेलाइट सेविंग टाइम (डीएसटी) जैसी विसंगतियों से निपटने के लिए नियम ।
पाने के ZoneId
लिए एक में आवेदन करें । हमेशा एक उचित समय क्षेत्र नाम निर्दिष्ट करें । कभी भी 3-4 संक्षिप्ताक्षरों का उपयोग न करें जैसे कि या तो अद्वितीय या मानकीकृत नहीं हैं।Instant
ZonedDateTime
EST
IST
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
LocalDateTime
यदि इनपुट स्ट्रिंग में ऑफसेट या ज़ोन के किसी भी संकेतक की कमी है, तो पार्स ए LocalDateTime
।
यदि आप निश्चित समय क्षेत्र के बारे में निश्चित हैं, तो ए ZoneId
का उत्पादन करने के लिए असाइन करें ZonedDateTime
। ऊपर tl में कोड उदाहरण देखें , शीर्ष पर ड्र अनुभाग।
स्वरूपित स्ट्रिंग्स
toString
मानक आईएसओ 8601 प्रारूप में दिनांक-समय मान का प्रतिनिधित्व करने वाले स्ट्रिंग उत्पन्न करने के लिए इन तीन वर्गों में से किसी पर विधि को कॉल करें । ZonedDateTime
वर्ग कोष्ठक में समय क्षेत्र का नाम जोड़कर मानक प्रारूप फैली हुई है।
String outputInstant = instant.toString(); // Ex: 2011-12-03T10:15:30Z
String outputOdt = odt.toString(); // Ex: 2007-12-03T10:15:30+01:00
String outputZdt = zdt.toString(); // Ex: 2007-12-03T10:15:30+01:00[Europe/Paris]
अन्य प्रारूपों के लिए DateTimeFormatter
वर्ग का उपयोग करें । आम तौर पर यह बताने के लिए कि कक्षा उपयोगकर्ता की अपेक्षित मानव भाषा और सांस्कृतिक मानदंडों का उपयोग करके स्थानीयकृत प्रारूप तैयार करती है। या आप एक विशेष प्रारूप निर्दिष्ट कर सकते हैं।
जावा के बारे में
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
, और अधिक ।
Joda समय
जबकि जोडा-टाइम अभी भी सक्रिय रूप से बना हुआ है, इसके निर्माताओं ने हमें सुविधाजनक तरीके से जैसे ही java.time पर माइग्रेट करने के लिए कहा है। मैं इस खंड को एक संदर्भ के रूप में बरकरार रखता हूं, लेकिन मैं java.time
इसके बजाय ऊपर दिए गए अनुभाग का उपयोग करने का सुझाव देता हूं ।
में Joda समय , दिनांक-समय वस्तु ( DateTime
) सही मायने में उसको दिए गए समय क्षेत्र में पता है। इसका मतलब है कि UTC से एक ऑफसेट और उस समय क्षेत्र के डेलाइट सेविंग टाइम (DST) और इस तरह की अन्य विसंगतियों के नियमों और इतिहास।
String input = "2014-01-02T03:04:05";
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeIndia = new DateTime( input, timeZone );
DateTime dateTimeUtcGmt = dateTimeIndia.withZone( DateTimeZone.UTC );
आईएसओ 8601 प्रारूप toString
में एक स्ट्रिंग उत्पन्न करने के लिए विधि को कॉल करें ।
String output = dateTimeIndia.toString();
Joda-Time सभी प्रकार के अन्य स्ट्रींग स्वरूपों को बनाने के लिए समृद्ध क्षमता प्रदान करता है।
यदि आवश्यक हो, तो आप Joda-Time DateTime से java.util.Date में परिवर्तित कर सकते हैं।
Java.util.Date date = dateTimeIndia.toDate();
कई अन्य उदाहरणों को खोजने के लिए "जॉदा तिथि" के लिए स्टैकऑवरफ़्लो खोजें, कुछ काफी विस्तृत।
† असल में वहाँ है एक समय क्षेत्र एक java.util.Date में एम्बेडेड, कुछ आंतरिक कार्यों के लिए इस्तेमाल किया (इस जवाब पर टिप्पणी देखें)। लेकिन इस आंतरिक समय क्षेत्र को एक संपत्ति के रूप में उजागर नहीं किया गया है, और इसे सेट नहीं किया जा सकता है। यह आंतरिक समय क्षेत्र , दिनांक-समय मान के स्ट्रिंग प्रतिनिधित्व को उत्पन्न करने की विधि द्वारा उपयोग किया जाने वाला नहीं है toString
; इसके बजाय JVM के वर्तमान डिफ़ॉल्ट समय क्षेत्र को मक्खी पर लागू किया जाता है। इसलिए, आशुलिपि के रूप में, हम अक्सर कहते हैं "juate का कोई समय क्षेत्र नहीं है"। भ्रमित? हाँ। फिर भी इन थके हुए पुराने वर्गों से बचने का एक और कारण।