2012-12-06 10 views
21

मैं स्थानीय समय क्षेत्र में एक स्ट्रिंग के रूप में javax.time.Instant कैसे प्रारूपित करूं? निम्नलिखित स्थानीय Instant से UTC का अनुवाद करता है, स्थानीय समय क्षेत्र के अनुसार, जैसा कि मैं उम्मीद कर रहा था। toLocalDateTime() पर कॉल को हटाने से वही होता है। मैं इसके बजाय स्थानीय समय कैसे प्राप्त कर सकता हूं?मैं एक javax.time कैसे प्रारूपित कर सकता हूं। स्थानीय समय क्षेत्र में एक स्ट्रिंग के रूप में स्थापित करें?

public String getDateTimeString(final Instant instant) 
{ 
    checkNotNull(instant); 
    DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); 
    DateTimeFormatter formatter = builder.appendPattern("yyyyMMddHHmmss").toFormatter(); 
    return formatter.print(ZonedDateTime.ofInstant(instant, TimeZone.UTC).toLocalDateTime()); 
} 

नोट: हम JSR-310 संदर्भ कार्यान्वयन के पुराने संस्करण 0.6.3 उपयोग कर रहे हैं।

उत्तर

0

कृपया ध्यान दें कि प्रश्न स्पष्ट रूप से (और बोल्ड टाइपफ़ेस में) JSR-310 संदर्भ कार्यान्वयन के पुराने संस्करण 0.6.3 को संदर्भित करता है! मैंने दिसंबर 2012 में जावा 8 के आगमन से पहले और नई तारीख पुस्तकालय से पहले इस सवाल से पूछा!


मैं JSR-310 कक्षाएं DateTimeFormatter और ZonedDateTime पर छोड़ दिया और बजाय पुराने जमाने java.util.Date और java.text.SimpleDateFormat का सहारा लिया:

public String getDateTimeString(final Instant instant) 
{ 
    checkNotNull(instant); 
    DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); 
    Date date = new Date(instant.toEpochMillisLong()); 
    return format.format(date); 
} 
+0

पर कॉल करना है, मुझे वास्तव में इस पुराने दृष्टिकोण का सहारा लेने की आवश्यकता नहीं दिखाई देती है। –

+0

@ साइमन एंड्रेफोर्सबर्ग: दुर्भाग्य से मुझे ऐसा इसलिए करना पड़ा क्योंकि हम JSR-310 संदर्भ कार्यान्वयन के 0.6.3 का उपयोग कर रहे थे। सौभाग्य से, हालांकि हमारे उत्पाद अभी भी जावा 7 का उपयोग करते हैं, फिर भी हम जावा 8 में दिखाई देने वाले नवीनतम जेएसआर -310 पर चले गए हैं। –

+0

दिनांक के लिए तिथि भी है, दिनांक। (तत्काल)। एनडब्ल्यूएम, अब अपने अजीब संस्करण को देखें – softarn

6

आप स्थानीय समय क्षेत्र का उपयोग करने की अपेक्षा क्यों करेंगे? आप स्पष्ट रूप से यूटीसी के लिए पूछ रहे हैं:

ZonedDateTime.ofInstant(instant, TimeZone.UTC) 

बस के बजाय आपके स्थानीय समय क्षेत्र निर्दिष्ट करें: इससे पहले कि आप नीचे मेरा उत्तर वोट

ZonedDateTime.ofInstant(instant, TimeZone.getDefault()) 
+0

मैं 'toLocalDateTime()' को स्थानीय या डिफ़ॉल्ट समय क्षेत्र में बदलने के लिए उम्मीद कर रहा था। जाहिर है, मैं गलत समझता हूं कि 'toLocatlDateTime() 'क्या करता है। मैंने सोचा कि मैं 'लोकलडेट टाइम' बना सकता हूं, लेकिन इस वर्ग में कोई तरीका नहीं है जो 'इंस्टेंट' को 'लोकलडेट टाइम' में बदल देता है। –

+2

@ डेरेकमार: स्थानीय का मतलब यह नहीं है कि आप क्या सोचते हैं, मूल रूप से। इसका मतलब सिर्फ एक तिथि और समय है जो किसी भी विशेष समय क्षेत्र से जुड़ा नहीं है।तो उदाहरण के लिए, दुनिया भर में, नया साल 1 जनवरी को आधी रात को शुरू होता है। किसी भी विशेष वर्ष के लिए, यह एक स्थानीयडेटाइम है - जो अलग-अलग समय क्षेत्रों के लिए अलग * इंस्टेंट * पर होता है। –

+0

दुर्भाग्यवश, जेएसआर -310 जेएसआर -310 के संस्करण 0.6.3 में 'java.util.TimeZone' और क्लास' javax.time.calendar.TimeZone' का उपयोग नहीं करता है, यह विधि 'getDefault() 'या प्रतीत नहीं होता है कोई भी इसी तरह की विधि। –

34

इस सवाल wrt लगभग समाप्त हो गया JDK1.8 संस्करण

उत्तर देना
DateTimeFormatter formatter = 
    DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.systemDefault()); 
return formatter.format(instant); 

कुंजी यह है कि Instant में कोई समय-क्षेत्र सूचना नहीं है आयन। इस प्रकार इसे दिनांक/समय फ़ील्ड, जैसे "yyyyMMddHHmmss" के आधार पर किसी भी पैटन का उपयोग करके स्वरूपित नहीं किया जा सकता है। DateTimeFormatter में ज़ोन निर्दिष्ट करके, तत्काल को स्वरूपण के दौरान निर्दिष्ट समय-क्षेत्र में परिवर्तित कर दिया जाता है, जिससे यह सही ढंग से आउटपुट हो सकता है। लेकिन मैं आम तौर पर पहले निर्णय लेंगे, जब मेरे डेटा वस्तु एक Instant था

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); 
return formatter.format(ZonedDateTime.ofInstant(instant, ZoneId.systemDefault())); 

दोनों दृष्टिकोण बराबर हैं,:

एक वैकल्पिक दृष्टिकोण ZonedDateTime कन्वर्ट करने के लिए है।

+0

उत्तर के लिए धन्यवाद। मुझे कोई संदेह नहीं है कि यह सही है, लेकिन मुझे इस समाधान को लागू करने के अगले अवसर के लिए इंतजार करना होगा। मुझे तब तक इंतजार करना पड़ेगा जब तक कि हमारी टीम जेएसआर -310 के संस्करण 0.6.3 को हालिया संस्करण के साथ बदलती है या जेडीके 6 को जेडीके 8 के साथ प्रतिस्थापित करती है। –

1

इस प्रयास करें:

String dateTime = DateTimeFormatter.ISO_ZONED_DATE_TIME.format(
    ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()) 
); 

यह देता है:

2014-08-25T21:52:07-07:00[America/Los_Angeles] 

आप DateTimeFormatter.ISO_ZONED_DATE_TIME फ़ॉर्मेटर के रूप में के अलावा कुछ का उपयोग करके प्रारूप बदल सकते हैं। डेटटाइमफॉर्मेटर में पूर्वनिर्धारित स्वरूपण का एक गुच्छा है, या आप स्वयं को परिभाषित कर सकते हैं।

+0

मुझे जेएसआर के संस्करण 0.6.3 में कक्षा 'जोन आईडी' नहीं मिल रहा है -310 संदर्भ कार्यान्वयन। –

संबंधित मुद्दे

 संबंधित मुद्दे