Analysieren ISO-Zeitstempel mit Java 8 java.time api (standard-edition)
Ich bin mit Mühe Millisekunden seit Beginn der Epoche aus dem string in dem Beispiel. Ich habe versucht, diese drei verschiedenen Möglichkeiten, so weit, und das Beispiel zeigt, wie der Letzte Versuch. Es scheint immer zu kommen, bis dass die TemporalAccessor nicht unterstützt ChronoField. Wenn konnte ich erfolgreich erstellen Sie eine Instanz von Instant, die ich verwenden könnte,toEpochMilli().
String dateStr = "2014-08-16T05:03:45-05:00"
TemporalAccessor creationAccessor = DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(dateStr);
Instant creationDate = Instant.from(creationAccessor);
Bitte geben Sie prägnante Antworten (nicht, bauen einen formatter von Grund auf) und verwenden Sie nur die java 8 standard-distribution (ich kann es mit Joda, aber wollen, um Abhängigkeiten zu vermeiden).
Edit: Instant.aus dem code oben wirft: java.time.DateTimeException: Unable to obtain Instant from TemporalAccessor: {OffsetSeconds=-18000},ISO resolved to 2014-08-16T05:03:45 of type java.time.format.Parsed
InformationsquelleAutor der Frage Travis Wellman | 2014-09-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies scheint ein Fehler zu sein, das fand ich in allen getesteten Versionen vor und einschließlich
jdk1.8.0_20b19
aber nicht in derjdk1.8.0_20
. So herunterladen einer up-to-date jdk-version würde das problem lösen. Es ist auch gelöst in der jüngsten jdk1.9.Beachten Sie, dass das gute alte Java 7 Weg funktioniert in allen Versionen:
Unterstützt es auch immer eine
Instant
:Aber, wie gesagt, ein einfaches update macht Sie Ihre Java - 8-code arbeiten.
InformationsquelleAutor der Antwort Holger
Ihr Code Funktioniert, Da Java 8 Update 51
Dein code funktioniert jetzt, wie Java 8 Update 51 auf Mac OS X Mountain Lion. Die Antwort von Holgerdass es sich möglicherweise um einen bug in früheren Versionen von Java. Verständlich, denn die java.Zeit Rahmen ist völlig neu in Java 8.
Hier ist eine modifizierte Kopie des Codes.
Dump in die Konsole.
Wenn Sie ausgeführt wird.
Kanonische Methode:
parse(CharSequence text, TemporalQuery<T> query)
Möchten Sie vielleicht zu erreichen, Ihre Analyse mit einer alternativen Methode.
Klasse doc für
DateTimeFormatter
erwähnt, dass die übliche Art und Weise zu analysieren, sollte ein Aufruf anDateTimeFormatter::parse(CharSequence text, TemporalQuery<T> query)
eher alsDateTimeFormatter::parse(CharSequence text)
.Also statt:
...dies tun, wo wir fügen Sie ein zweites argument, das argument ist ein Methode Referenz in Java 8-syntaxrufen Sie die Umwandlung
from
Methode (in diesem BeispielZonedDateTime :: from
):Dump in die Konsole.
Wenn Sie ausgeführt wird.
InformationsquelleAutor der Antwort Basil Bourque
Da instant nicht richtig dargestellt werden, verwenden Sie eine lange (Sie haben entwickelt, die die API nicht von Y 2040 Probleme, wenn ein lange nicht mehr ausreicht), müssen Sie verwenden eine Kombination der beiden Methoden
getEpochSecond()
und
getNano()
Den ehemaligen bekommt Sie die Anzahl der Sekunden von der Epoche, und der letztere gibt Ihnen die # von Nanosekunden, die sind vergangen, seit die in derselben Sekunde.
InformationsquelleAutor der Antwort Matt
Instant.aus(creationAccessor).toEpochMili() Sortieren sollte Sie, zumindest nach den ThreeTen javadoc für TemporalInstant. ThreeTen ist die Referenz-Implementierung von javax.Zeit. Lassen Sie mich wissen, wenn dies für Sie arbeitet oder nicht, indem Sie einen Kommentar.
InformationsquelleAutor der Antwort hd1