Ist java.Zeit scheitern zu analysieren Bruchteil-der-Sekunde?
Mit dem ersten release von Java 8 (b132) auf Mac OS X (Mavericks), diesen code mit der neuen java.Zeit-Paket funktioniert:
String input = "20111203123456";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyyMMddHHmmss");
LocalDateTime localDateTime = LocalDateTime.parse( input, formatter );
Rendering:
2011-12-03T12:34:56
Aber wenn ich "SS" für Bruchteil-der-Sekunde (und "55" als Eingabe), wie angegeben, in der DateTimeFormatter-Klasse doc, wird eine Ausnahme geworfen:
java.time.format.DateTimeParseException: Text '2011120312345655' could not be parsed at index 0
Der doc sagt Strict-Modus wird standardmäßig verwendet und erfordert die gleiche Anzahl der format-Zeichen als Eingabe Ziffern. Also ich bin verwirrt, warum dieser code nicht:
String input = "2011120312345655";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyyMMddHHmmssSS");
LocalDateTime localDateTime = LocalDateTime.parse( input, formatter );
Weiteres Beispiel der Verwendung Beispiel aus der Dokumentation ("978") (schlägt fehl):
String input = "20111203123456978";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyyMMddHHmmssSSS");
LocalDateTime localDateTime = LocalDateTime.parse( input, formatter );
Dieses Beispiel funktioniert, indem ein Komma (, aber ich finde keine solche Anforderung in der doc):
String input = "20111203123456.978";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyyMMddHHmmss.SSS");
LocalDateTime localDateTime = LocalDateTime.parse( input, formatter );
Macht:
localDateTime: 2011-12-03T12:34:56.978
Weglassen der Periode den Charakter von entweder den input-string oder das format verursachen scheitern.
Ausfällt:
String input = "20111203123456.978";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyyMMddHHmmssSSS");
LocalDateTime localDateTime = LocalDateTime.parse( input, formatter );
Ausfällt:
String input = "20111203123456978";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyyMMddHHmmss.SSS");
LocalDateTime localDateTime = LocalDateTime.parse( input, formatter );
Nach re-Lektüre der Dokumente, können Sie versuchen, indem ein Komma nach dem Sekunden-Feld? Wie 20111203123456.978?
Hinzufügen eines dezimal-Punkt macht es Arbeit. Siehe Ergänzung unten die Frage. Aber können Sie mir so eine Voraussetzung bei der doc? ich bin versucht zu bestimmen, wenn ich sein Einreichung einen Fehlerbericht.
Erstens, gut, dass es für Sie gearbeitet. Zweitens, ich hatte nicht gesehen, dass es speziell geschrieben, sondern mehr wie meine interpretation der Bruchteil einer Sekunde. Einen Bruchteil der Sekunde vorangestellt werden soll eine Dezimalzahl. Es macht keinen Sinn, nicht mit Nachkommastellen. Um einen Vergleich mit der Zeit HH:mm:ss Doppelpunkt wird normalerweise verwendet, als Trennzeichen, aber es ist nicht Teil des Feldes. Daher Doppelpunkt ist nicht erforderlich, da es nicht Teil des Felds. Aber den Bruchteil einer Sekunde ist ein Teil des Sekunden Felds. So sollte es sein, getrennt durch eine Dezimalzahl. Das ist, wie ich intepret. Aber fühlen Sie sich frei, melden Sie einen bug-Bericht, wenn Sie immer noch denke, es ist ein bug.
eines der großen Probleme ist, dass die SE-tag-system nicht berücksichtigt . in der gleichen Weise, es hält andere Satzzeichen. Menschen auf der Suche nach
java-time
sind nicht zu sehen java.time
, und es gibt ein schrecklich - mix von tags in verschiedenen Orten, verwenden Sie eine statt des anderen. Wenn Sie denken, dass der tag mit der Zeit werden mehr hilfreich, dann lassen Sie uns völlig auslöschen den anderen tag zu löschen, die Mehrdeutigkeit.InformationsquelleAutor Basil Bourque | 2014-03-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bug – Behoben in Java 9
Dieses Problem wurde bereits berichtet, in JDK-bug-log. Stephen Colebourne nennt als work-around folgende Lösung:
Hinweis: Diese Problemumgehung nicht decken Sie Ihre use-case von nur zwei Muster-Symbole der SS. Eine Anpassung kann nur auf andere Felder verwenden wie MICRO_OF_SECOND (6 mal SSSSSS) oder NANO_OF_SECOND (9 mal SSSSSSSSS). Für zwei Nachkommastellen, siehe mein update unten.
@PeterLawrey Über die Bedeutung der Muster, symbol "S" siehe diese Dokumentation:
So sehen wir, dass S steht für ein Bruchteil der Sekunde (einschließlich Nanosekunden), nicht nur Millisekunden. Außerdem, der gebrochene Teil kann im moment nicht nehmen, auch in den angrenzenden Analyse Wert, leider.
EDIT:
Als hintergrund hier einige Bemerkungen über angrenzende Analyse Wert. Solange die Felder sind getrennt durch Literale wie ein dezimal-Punkt oder Zeit-Teil Trennzeichen (Doppelpunkt), wird die interpretation der Felder in einem text analysiert werden ist nicht schwer, weil der parser weiß dann einfach, wenn zu stoppen, d.h. wenn das Feld Teil beendet ist, und wenn das nächste Feld beginnt. Daher die JSR-310-parser verarbeiten kann, die text-Sequenz, wenn Sie geben Sie einen Dezimalpunkt ein.
Aber wenn Sie haben eine Folge von benachbarten Ziffern spanning über mehrere Felder, dann einige Umsetzung Schwierigkeiten auftreten. Damit der parser weiß, wenn ein Feld Stoppt, im text ist es notwendig, weisen Sie den parser im Voraus, dass in einem bestimmten Gebiet ist vertreten durch eine Feste Breite von Ziffer chars. Dies funktioniert mit allen
appendValue(...)
-Methoden, die davon ausgehen, numerische Darstellungen.Leider JSR-310 nicht geschafft hat gut zu tun mit den gebrochenen Teil (
appendFraction(...)
). Wenn Sie sich für das Stichwort "direkt" in die javadoc der KlasseDateTimeFormatterBuilder
dann finden Sie, dass diese Funktion NUR realisiert durchappendValue(...)
-Methoden. Beachten Sie, dass die Spezifikation für das Muster Buchstaben " S " ist leicht unterschiedlich, aber intern die DelegiertenappendFraction()
-Methode. Ich nehme an, wir haben zumindest zu waint bis Java 9 (wie berichtet im JDK-bug-log, oder später???) bis Bruchteil Teile verwalten können benachbarte Analyse Wert als gut.Update von 2015-11-25:
Den folgenden code mit zwei Nachkommastellen nur nicht funktioniert und wirft einen
DateTimeParseException
.Den workaround
funktioniert nicht, weil
SimpleDateFormat
interpretiert den Bruch in eine falsche Richtung (siehe Ausgabe 55 ms anstelle von 550 ms).Was bleibt als Lösung entweder zu warten, eine undertermined lange Zeit, bis Java 9 (oder höher?) oder schreiben Sie Ihre eigenen hack oder mit 3rd-party-Bibliotheken als Lösung.
Lösung basiert auf einem dirty hack:
Lösung mit Joda-Time:
Lösung, die mithilfe von "meine Bibliothek"Time4J:
Update von 2016-04-29:
Als die Leute sehen können, über die JDK-Problem erwähnt oben, es ist nun markiert als gelöst - für Java 9.
InformationsquelleAutor Meno Hochschild
Hier ist ein Algorithmus mit dessen Hilfe die Reihenfolge der Nullen, die konventionell kehrte aus dem formatierten Datum
String
.Du hast absolut Recht. Ich hatte gehofft, die Kommentare sprechen für sich, aber Sie sind richtig, dass es zumindest verdient einige Kontext.
InformationsquelleAutor Mapsy
Etwas wie das half mir
InformationsquelleAutor Andrei Amarfii