2016-03-02 8 views
5

JAXB के साथ xs:dateTime को ठीक से संभालने के लिए, मुझे String ->java.time.OffsetDateTime से अपना स्वयं का कनवर्टर लिखना होगा।xsd: जावा ऑफसेट दिनांक दिनांक दिनांक

जैसा कि एक्सएमएल स्कीमा डेफिनिशन में उल्लिखित है, डेटटाइम आईएसओ 8601 से प्रेरित था। मैंने का उपयोग xs:dateTime को पार्स करने के लिए किया था, जो उदाहरण के लिए ठीक काम करता है।

"2007-12-03T10:15:30+01:00" //or 
"2007-12-03T10:15:30Z" 

दुःख की बात है xs:dateTime में पार्ट is declared optional ऑफसेट, इसलिए पार्स करने मान्य

"2016-03-02T17:09:55" 

फेंकता एक DateTimeParseException

वहाँ OffsetDateTime के लिए एक DateTimeFormatter है, जो भी unzoned xs:dateTime रों (शायद एक डिफ़ॉल्ट समय क्षेत्र के साथ) संभालती है?

उत्तर

4

मुझे नहीं लगता कि एक अंतर्निहित है लेकिन आप DateTimeFormatterBuilder कक्षा की सहायता से अपना स्वयं का बना सकते हैं।

आप एक वैकल्पिक ऑफसेट चुकता कोष्ठक में निर्दिष्ट कर सकते हैं अर्थात [XXXXX] ("+HH:MM:ss" मैच के लिए), उसके बाद, आप एक डिफ़ॉल्ट ऑफसेट (parseDefaulting) जहां यह मौजूद नहीं है प्रदान कर सकते हैं। यदि आप यूटीसी को डिफ़ॉल्ट करना चाहते हैं, तो आप ऑफ़सेट निर्दिष्ट करने के लिए 0 सेट कर सकते हैं; और यदि आप वीएम के वर्तमान ऑफसेट में डिफ़ॉल्ट करना चाहते हैं, तो आप इसे OffsetDateTime.now().getLong(ChronoField.OFFSET_SECONDS) के साथ प्राप्त कर सकते हैं।

public static void main(String[] args) { 
    String[] dates = { 
     "2007-12-03T10:15:30+01:00", 
     "2007-12-03T10:15:30Z", 
     "2016-03-02T17:09:55", 
     "2016-03-02T17:09:55Z" 
    }; 
    DateTimeFormatter formatter = 
     new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd'T'HH:mm:ss[XXXXX]") 
             .parseDefaulting(ChronoField.OFFSET_SECONDS, 0) 
             // or OffsetDateTime.now().getLong(ChronoField.OFFSET_SECONDS) 
             .toFormatter(); 
    for (String date : dates) { 
     System.out.println(OffsetDateTime.parse(date, formatter)); 
    } 
} 
1

सिर्फ मेरे वर्तमान समाधान जो सिस्टम डिफ़ॉल्ट पार्स dateTime में वर्तमान में ऑफसेट करने के लिए unzoned प्रारूप का समाधान करता है दिखाने के लिए।

public static OffsetDateTime parseDateTime(String s) { 
    if (s == null) { 
     return null; 
    } 
    try { 
     return OffsetDateTime.parse(s, DateTimeFormatter.ISO_OFFSET_DATE_TIME); 
    } catch (DateTimeParseException e) { 
     try { // try to handle zoneless xml dateTime 
      LocalDateTime localDateTime = LocalDateTime.parse(s, DateTimeFormatter.ISO_LOCAL_DATE_TIME); 
      ZoneOffset offset = ZoneId.systemDefault().getRules().getOffset(localDateTime); 
      return OffsetDateTime.of(localDateTime.toLocalDate(), localDateTime.toLocalTime(), offset); 
     } catch (Exception fallbackTryException) { 
      throw e; 
     } 
    } 
} 
+0

आह, इसलिए ऑफसेट गुम होने पर, आप अपने जेवीएम के समय क्षेत्र में दिनांक-समय की व्याख्या करते हैं। मुझे लगता है कि मैं 'localDateTIme.atZone (ZoneId.systemDefault()) का उपयोग करूंगा। ToOffsetDateTime()'। क्या इसे पढ़ने में थोड़ा आसान नहीं है? –

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