2016-03-02 21 views
5

Per gestire correttamente uno xs:dateTime con JAXB, devo scrivere il mio convertitore da String ->java.time.OffsetDateTime.xsd: dateTime to Java OffsetDateTime

Come menzionato nella definizione dello schema XML, dateTime è stato ispirato dalla ISO 8601. Ho usato OffsetDateTime.parse(s, DateTimeFormatter.ISO_OFFSET_DATE_TIME) per analizzare lo xs:dateTime, che funziona bene per es.

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

Purtroppo, nel xs:dateTime l'offset parte is declared optional, quindi l'analisi del valido

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

genera DateTimeParseException.

C'è un DateTimeFormatter per OffsetDateTime, che gestisce anche unzoned xs:dateTime s (probabilmente con un fuso orario predefinito)?

risposta

4

Non penso ci sia un built-in, ma puoi crearne uno con l'aiuto della classe DateTimeFormatterBuilder.

È possibile specificare un offset tra parentesi quadrate opzionale, cioè [XXXXX] (per abbinare "+HH:MM:ss"), quindi, è possibile fornire un offset di default (parseDefaulting) nel caso in cui non sia presente. Se si desidera impostare l'impostazione predefinita su UTC, è possibile impostare 0 per specificare nessun offset; e se si desidera impostare l'offset corrente della VM, è possibile ottenerlo con 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

solo per mostrare il mio attuale soluzione che risolve il formato unzoned ai sistemi di default compensato al momento in dateTime parse.

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

Ah, quindi, quando manca l'offset, si interpreta la data-ora nel fuso orario della propria JVM. Penso che userò 'localDateTIme.atZone (ZoneId.systemDefault()). ToOffsetDateTime()'. Non è un po 'più facile da leggere? –