2016-01-15 13 views
8

मुझे यूटीसी में स्थानीय दिनांक (या smth else) में निम्नलिखित प्रारूप 2015-01-15-05:00 में एक स्ट्रिंग को पार्स करने की आवश्यकता है। कि निम्नलिखित कोड समस्या है:जावा 8 ऑफसेट दिनांक पार्सिंग

System.out.println(LocalDate.parse("2015-01-15-05:00", DateTimeFormatter.ISO_OFFSET_DATE)); 

आउटपुट 2015-01-15 अनदेखी ऑफसेट। वांछित आउटपुट 2015-01-16

अग्रिम धन्यवाद!

+1

आपको क्यों लगता है कि परिणाम 2015-01-16 होना चाहिए? स्पष्ट रूप से आप एक अनगिनत धारणा करते हैं कि गैर-मौजूदा घड़ी का समय कैसा होगा (हमेशा आपके सभी इनपुट स्ट्रिंग्स के लिए समान ???)। मेरे लिए, तिथि उतनी ही पार्स की गई है: 2015-01-15। अनुपस्थित समय भाग के कारण यूटीसी से कोई संबंध नहीं है। –

उत्तर

7

सरल जवाब OffsetDateTime उपयोग करने के लिए डेटा का प्रतिनिधित्व करने के लिए है, लेकिन आप समय डिफ़ॉल्ट की जरूरत है:

DateTimeFormatter fmt = new DateTimeFormatterBuilder() 
    .append(DateTimeFormatter.ISO_OFFSET_DATE) 
    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) 
    .toFormatter(); 
OffsetDateTime dt = OffsetDateTime.parse("2015-01-15-05:00", fmt); 
LocalDate date = dt.withOffsetSameInstant(ZoneOffset.UTC).toLocalDate(); 

ZonedDateTime उपयोगी है समय-क्षेत्रों के साथ काम है, लेकिन जब करता है, तो आप केवल ऑफ़सेट से निपट रहे हैं, OffsetDateTime सरल है।

सामान्य रूप से, एप्लिकेशन कोड TemporalAccessor प्रकार के चर नहीं रखता है। यदि आप इसे देखते हैं, तो आम तौर पर एक बेहतर तरीका होता है।

+2

प्रत्यक्ष और आधिकारिक। मार्गदर्शन के लिए धन्यवाद! –

+0

@ जोडास्टेफेन, यह अभी भी 2015-01-15 – StasKolodyuk

+0

@ जोडास्टेफेन आउटपुट करता है, यह होना चाहिए .parseDefaulting (ChronoField.HOUR_OF_DAY, 24) – StasKolodyuk

2

ऐसा लगता है जैसे मुझे एक आत्मा मिली है। संदेश यह है:

TemporalAccessor temporalAccessor = DateTimeFormatter.ISO_OFFSET_DATE.parse("2015-01-15-05:00"); 
ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDate.from(temporalAccessor), LocalTime.MAX, ZoneId.from(temporalAccessor)); 
System.out.println(zonedDateTime.withZoneSameInstant(ZoneOffset.UTC).toLocalDate()); 
संबंधित मुद्दे