2016-03-02 15 views
5

xs:dateTimeをJAXBで正しく処理するには、String - >java.time.OffsetDateTimeから独自のコンバータを作成する必要があります。xsd:dateTime to Java OffsetDateTime

XMLスキーマ定義に記載されているように、dateTimeはISO 8601からインスピレーションを受けました。私はOffsetDateTime.parse(s, DateTimeFormatter.ISO_OFFSET_DATE_TIME)を使用してxs:dateTimeを解析しました。悲しいことに

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

xs:dateTimeにインクルードはとても有効な

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

DateTimeParseExceptionをスロー解析し、一部is declared optionalを相殺しました。

OffsetDateTimeにはDateTimeFormatterがあります(これには、おそらくデフォルトのタイムゾーンが設定されています)xs:dateTimeも処理されますか?

答えて

4

私は内蔵されているとは思っていませんが、DateTimeFormatterBuilderクラスの助けを借りて自分で作ることができます。あなたはすなわち[XXXXX]"+HH:MM:ss"に一致するように)、乗括弧で囲まれたオフセットのオプションを指定することができます

、その後、あなたはそれが存在しない場合にはデフォルトのオフセット(parseDefaulting)を提供することができます。デフォルトをUTCにしたい場合は、オフセットを指定しないように0を設定します。 VMの現在のオフセットをデフォルトにしたい場合は、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ででオフセットシステムのデフォルトにゾーン分割されていない形式を解決し、私の現在のソリューションを表示します。

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

ああ、オフセットがない場合は、JVMのタイムゾーンの日時を解釈します。私は 'localDateTIme.atZone(ZoneId.systemDefault())。toOffsetDateTime()'を使うと思います。それは少し読みやすいですか? –