2015-05-09 4 views
14

Gemäß der SimpleDateFormat class documentation unterstützt Java keine Zeitgranularität über Millisekunden in seinen Datumsmustern.Java-Datumsanalyse mit Mikrosekunden- oder Nanosekundengenauigkeit

Also, ein Datum Zeichenfolge wie

  • 2015-05-09 00: 10: // 23,999750900 Die letzten 9 Ziffern bezeichnen ns

, wenn sie über das Muster analysiert

  • JJJJ-MM-TT HH: mm: ss.SSSSSSSSS // 9 'S'-Symbole

interpretiert tatsächlich die ganze Zahl nach dem . Symbol als (fast 1 Milliarde!) Millisekunden und nicht als Nanosekunden, in dem Datum resultierenden

  • 2015-05-20 21:52:53 UTC

dh über 11 Tage im Voraus. Überraschenderweise führt die Verwendung einer kleineren Anzahl von S Symbolen immer noch dazu, dass alle 9 Ziffern analysiert werden (anstelle von beispielsweise der am weitesten links liegenden 3 für .SSS).

Es gibt 2 Möglichkeiten richtig um dieses Problem zu umgehen:

  • Verwenden String Vorverarbeitung
  • Verwenden Sie eine benutzerdefinierte Simple Implementierung

Gäbe es eine andere Möglichkeit, eine richtige Lösung nur für das Erhalten Liefern ein Muster an die Standard SimpleDateFormat Implementierung, ohne weitere Code-Modifikationen oder String-Manipulation?

+2

* ... indem Sie einfach ein Muster an die Standard-'SimpleDateFormat'-Implementierung übergeben, ohne weitere Code-Modifikationen oder String-Manipulation? * Offensichtlich nicht. –

+1

Ja, so scheint es. – PNS

Antwort

10

Nope

Nein, können Sie nicht verwenden Simplenanosekunden zu behandeln.

Aber Ihre Prämisse, dass ...

Java nicht Zeitgranularität über Millisekunden in seinem Datum Mustern

... ist nicht mehr wahr, wie die Java 8 unterstützen.

java.time

SimpleDateFormat und die java.util.Date/.Calendar Klassen verwandt sind jetzt durch das neue java.time Paket in Java 8 (Tutorial) gefunden unmodern.

Die neuen Klassen java.time unterstützen nanosecond Auflösung. Diese Unterstützung umfasst das Parsen und Erzeugen von neun Ziffern der Bruchteilsekunde. Wenn Sie beispielsweise die API java.time.format verwenden, bezeichnet der Musterbuchstabe S einen "Bruchteil der Sekunde" statt "Millisekunden" und kann Nanosekundenwerte verarbeiten.

2013-08-20T12:34:56.123456789Z 

java.sql.Timestamp

Die java.sql.Timestamp Klasse verarbeitet auch Nanosekunde Auflösung, aber in einer unangenehmen Art und Weise. Im Allgemeinen sollten Sie Ihre Arbeit in java.time-Klassen erledigen.

Bis JDBC-Treiber aktualisiert werden, um direkt java.time Datentypen unterstützen, können Sie toInstant und from Methoden hin und her zwischen java.sql.Timestamp und java.time gehen.

+0

Ja, obwohl die Anforderung aufgrund des entsprechenden Anwendungsfalls für eine SimpleDateFormat-Lösung galt. – PNS