2015-09-28 19 views
6

Ich habe diese wunderbare statische Methode gestern, und es funktionierte gut - gesternParsing ISO_INSTANT und ähnliches Datum Zeit Strings

Doch heute gibt es mir diesen Fehler. Ich denke, es von zu vielen 0s ist, bevor der Z.

Kann jemand empfehlen, wie in prägnanter Weise (Java 8) diese Art von String Format Datum zu analysieren - wenn man bedenkt, dass es gestern auch gearbeitet, so ISO_INSTANT ist auch ein gültiges Format für die String?

Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {NanoOfSecond=0, InstantSeconds=1443451604, MilliOfSecond=0, MicroOfSecond=0},ISO of type java.time.format.Parsed 
at java.time.LocalDate.from(LocalDate.java:368) 
at java.time.LocalDateTime.from(LocalDateTime.java:456) 
... 9 more 

eine Ausnahme auf Eingabezeit zu werfen: "2015-09-28T14: 46: 44.000000Z"

/** 
* 
* @param time the time in RFC3339 format (e.g. "2013-07-03T14:30:38Z") 
* @return 
*/ 
public static LocalDateTime parseTimeINSTANT(String time) { 
    DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT; 
    return LocalDateTime.from(f.parse(time)); 
} 

enter image description here

+0

ISO_INSTANT folgt nicht Zeitzonen unterstützt, kann wie mit etwas festgelegt werden: 'Instant.from (DateTimeFormatter.ISO_DATE_TIME.parse (" 2017-04-20T00: 00: 00 + 04: 00 "))' –

Antwort

11

Sie einen String parsen, die mit einem ISO Augenblick im Einklang Daher müssen Sie das Ergebnis in einem Instant statt LocalDateTime speichern:

public static Instant parseTimeINSTANT(String time) { 
    DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT; 
    return Instant.from(f.parse(time)); // could be written f.parse(time, Instant::from); 
} 

Beachten Sie, dass dieser Formatierer korrekt Sekundenbruchteile behandelt, sodass Sie sie nicht entfernen müssen. Zitieren DateTimeFormatter.ISO_INSTANT Javadoc (Hervorhebung meins):

Beim Parsen ist Zeit bis mindestens die Sekunden erforderlich. Bruch Sekunden von Null bis Neun werden geparst.

Wie, warum es gestern gearbeitet und heute nicht, ich habe keine Ahnung ...

+0

danke, und es ist in Ordnung zu tun 'LocalDateTime.from (instant);'? Mein Code erwartet wirklich das LocalDateTime-Format. Nanosekunden sind nicht wichtig – ycomp

+2

@ycomp Sie können ein Instant in LocalDateTime konvertieren, siehe [diese Antwort] (http://stackoverflow.com/a/19726814/1743880). – Tunaki

+0

vielleicht habe ich es gestern einfach programmiert, dachte ich habe es ausgeführt, aber habe es bis heute nicht ausgeführt - ich kann nichts in meinem Code sehen, das anzeigt, dass ich es gestern hätte ausführen können. Ich denke also, es hat nie wirklich funktioniert Ich habe es ursprünglich codiert – ycomp

3

Nur um jemanden zu helfen, diese Frage zu sehen, später.

Sie müssen das ISO-Datum als Instant analysieren, in Instant Objekt konvertieren und dann ein LocalDateTime davon erstellen, die die Zonen-ID bereitstellt. Ich setze hier die Zonen-ID von UTC.

Der Code ist als

public static LocalDateTime getISODate(String dateString) { 
    DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_INSTANT; 
    Instant dateInstant = Instant.from(isoFormatter.parse(dateString)); 
    LocalDateTime date = LocalDateTime.ofInstant(dateInstant, ZoneId.of(ZoneOffset.UTC.getId())); 

    return date; 
}