tl; डॉ
Instant.ofEpochMilli( 1_317_816_735_000L )
.atZone( ZoneId.of( "Pacific/Auckland" ) )
.format( DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( new Locale( "en" , "NZ" ) ) )
… भी…
LocalDateTime.parse( "2011-10-06 03:35:05".replace( " " , "T" ) )
.atZone( ZoneId.of( "Pacific/Auckland" ) )
java.time
प्रश्न और अधिकांश उत्तर जावा के शुरुआती संस्करणों से पुरानी विरासत तिथि-समय की कक्षाओं का उपयोग करते हैं। ये पुराने वर्ग परेशान और भ्रमित करने वाले साबित हुए हैं। इनसे बचें। इसके बजाय java.time कक्षाओं का उपयोग करें।
आईएसओ 8601
आपका इनपुट स्ट्रिंग मानक ISO 8601 प्रारूप में लगभग है। बस एक के साथ बीच में अंतरिक्ष की जगह T
।
String input = "2011-10-06 03:35:05".replace( " " , "T" );
LocalDateTime
अब पार्स के LocalDateTime
कारण इनपुट में ऑफ़सेट-यूटीसी या टाइम ज़ोन के बारे में कोई जानकारी नहीं है। ए LocalDateTime
में ऑफसेट की कोई अवधारणा नहीं है और न ही समय क्षेत्र है, इसलिए यह समय पर वास्तविक क्षण का प्रतिनिधित्व नहीं करता है ।
LocalDateTime ldt = LocalDateTime.parse( input );
ZoneOffset
आप यह कहते हुए प्रतीत होते हैं कि व्यावसायिक संदर्भ से आप जानते हैं कि इस तार का इरादा उस क्षण का प्रतिनिधित्व करना है जो यूटीसी से 13 घंटे आगे है। इसलिए हम तुरंत ए ZoneOffset
।
ZoneOffset offset = ZoneOffset.ofHours( 13 );
OffsetDateTime
OffsetDateTime
ऑब्जेक्ट प्राप्त करने के लिए इसे लागू करें । यह समयरेखा पर एक वास्तविक क्षण बन जाता है।
OffsetDateTime odt = ldt.atOffset( offset);
ZoneId
लेकिन फिर आप न्यूजीलैंड का उल्लेख करते हैं। तो आपके मन में एक विशिष्ट समय क्षेत्र था। डे-टाइम सेविंग टाइम (DST) जैसी विसंगतियों से निपटने के लिए एक टाइम ज़ोन एक ऑफ़सेट-यूटीसी प्लस है। तो हम एक निर्दिष्ट कर सकते हैं ZoneId
एक करने के लिए ZonedDateTime
एक मात्र ऑफसेट के बजाय।
एक उचित समय क्षेत्र नाम निर्दिष्ट करें । कभी इस तरह के रूप में 3-4 पत्र संक्षिप्त नाम का उपयोग EST
या IST
के रूप में वे सच समय क्षेत्र, नहीं मानकीकृत, और यहां तक कि अद्वितीय नहीं नहीं कर रहे हैं (!)। उदाहरण के लिए, Pacific/Auckland
।
ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime
लागू करें ZoneId
।
ZonedDateTime zdt = ldt.atZone( z );
आप समयरेखा पर उसी क्षण के लिए किसी अन्य क्षेत्र में आसानी से समायोजित कर सकते हैं।
ZoneId zParis = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdtParis = zdt.withZoneSameInstant( zParis );
युग से गिनती
मैं दृढ़ता से तारीख के समय के मूल्यों को संभालने के खिलाफ सिफारिश करता हूं, जैसे कि यूओच से एक गिनती, जैसे कि 1970 यूटीसी की शुरुआत से मिलीसेकंड। लेकिन यदि आप ऐसा करना चाहते हैं, तो Instant
ऐसी संख्या से बनाएं ।
Instant instant = Instant.ofEpochMilli( 1_317_816_735_000L );
फिर एक समय क्षेत्र निर्दिष्ट करें जैसा कि ऊपर देखा गया है, यदि वांछित है, तो यूटीसी से दूर जाने के लिए।
ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = instant.atZone( z );
आपका मान 1_317_816_735_000L
है:
2011-10-05T12:12:15Z
(बुध, ०५ अक्टूबर २०११ १२:१२:१५ GMT)
2011-10-06T01:12:15+13:00[Pacific/Auckland]
(गुरुवार 06 अक्टूबर, 2011 01:12:15 ऑकलैंड न्यूजीलैंड में)।
तार पैदा करना
मानक आईएसओ 8601 प्रारूप में एक स्ट्रिंग उत्पन्न करने के लिए , बस कॉल करें toString
। ध्यान दें कि ZonedDateTime
वर्ग ब्रैकेट में समय क्षेत्र का नाम जोड़कर मानक प्रारूप को बुद्धिमानी से विस्तारित किया गया है।
String output = zdt.toString();
अन्य प्रारूपों के लिए, DateTimeFormatter
वर्ग के लिए ढेर अतिप्रवाह खोजें । पहले से ही कई बार कवर किया।
एक FormatStyle
और एक निर्दिष्ट करें Locale
।
Locale l = new Locale( "en" , "NZ" );
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( l );
String output = zdt.format( f );
ध्यान दें कि समय क्षेत्र का लोकेल से कोई लेना- देना नहीं है। आपके पास Europe/Paris
जापानी भाषा और सांस्कृतिक मानदंडों में एक Asia/Kolkata
तिथि-समय प्रदर्शित हो सकता है , या पुर्तगाली भाषा और ब्राजील के सांस्कृतिक मानदंडों में प्रदर्शित तिथि-समय हो सकता है।
जावा के बारे में
Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं जैसे परेशानी पुराने तिथि-समय वर्गों को प्रतिस्थापित java.util.Date
, .Calendar
, और java.text.SimpleDateFormat
।
Joda समय परियोजना, अब में रखरखाव मोड , प्रवास java.time को सलाह देता है।
अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें।
Java.time की अधिकांश कार्यक्षमता थ्रीटेन-बैकपोर्ट में जावा 6 और 7 के लिए वापस पोर्ट की गई है और आगे थ्रीटेनबप में Android के लिए अनुकूलित है (देखें कि कैसे उपयोग करें ... )।
ThreeTen-अतिरिक्त परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के लिए भविष्य के संभावित अतिरिक्त के लिए एक साबित जमीन है। आप यहाँ कुछ उपयोगी वर्गों जैसे मिल सकता है Interval
, YearWeek
, YearQuarter
और भी बहुत कुछ।