4 Stimmen

Falsche Ausgabe für java.text.SimpleDateFormat beim Lesen von "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZZZZZ"

Ich versuchte, das Datum im String-Format in java.util.Date umzuwandeln, indem ich java.text.SimpleDateFormat verwendete, jedoch gibt es mir nicht das richtige Ergebnis. Bitte helfen Sie!

Meine Eingabe wird vom Django-Datum generiert: z. B. "2014-01-20T07:17:06.150995+00:00"

Aber ich erhielt "Mon Jan 20 15:19:36 GMT+08:00 2014" anstelle von "Mon Jan 20 15:17:06 GMT+08:00 2014"

Hier ist mein Testcode:

String s = "2014-01-20T07:17:06.150995+00:00";

SimpleDateFormat sdf;
String fmt = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZZZZZ";
sdf = new SimpleDateFormat(fmt, Locale.US);

String result = "";
try {
    Date date = sdf.parse(s);
    Log.d(Constants.LOG_TAG, date.toString());
    result = date.toString();
} catch (Exception e) {
    Log.d(Constants.LOG_TAG, "Fehler beim Datum formatieren" + e.getMessage());
}
Log.d(Constants.LOG_TAG, "Datumstest >> " + result);

7voto

Keppil Punkte 45223

Wie Sie sehen können, unterscheiden sich Ihre beiden Daten um 2,5 Minuten.

Das passiert, weil Sie Mikrosekunden als Millisekunden interpretieren. Dies fügt Ihrem Ergebnis 150.000 Millisekunden hinzu, oder 2,5 Minuten.

Es gibt keine standardisierte Möglichkeit, einen Datumsstring mit Mikrosekunden mit SimpleDateFormat zu interpretieren. Sie müssen es selbst machen, wenn Sie den Quellstring nicht in einem anderen Format erhalten können.

Wenn das Datum immer genau in diesem Format ist, könnten Sie etwas wie folgt tun:

String datumOhneMicros = s.substring(0, s.length() - 9) + s.substring(s.length() - 6);
Date datum = sdf.parse(datumOhneMicros);

2voto

SNeutrino Punkte 21

Als ich zum ersten Mal versuchte, deinen Code auszuführen (habe Log.d durch System.out.println() ersetzt), bekam ich eine ParseException: Nicht analysierbares Datum.

Als nächstes habe ich mehrere Teile des Datums mit ihren entsprechenden Formatzeichenfolgen ausprobiert. Letztendlich lag das Problem am Zeitzonenteil "+00:00" beziehungsweise "ZZZZZ".

Ich habe über die Musterzeichen in der Dokumentation gelesen (http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html) und gefunden:
Z -> -0800
X -> 08; -0800; -08:00
Also habe ich dein ZZZZZ mit X ausgetauscht und dann hat es für mich funktioniert. Letztendliche Formatzeichenfolge:
String fmt = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSX";

1voto

Basil Bourque Punkte 256611

Vermeiden Sie die Verwendung der Klassen java.util.Date & .Calendar und java.text.SimpleTextFormat. Sie sind berüchtigt problematisch.

Joda-Time

Verwenden Sie die Open-Source-Third-Party-Bibliothek Joda-Time 2.3, um diesen ISO 8601 formatierten String direkt an einen Konstruktor zu übergeben. Keine Notwendigkeit für Formatter und Parser.

Allerdings hat Joda-Time wie java.util.Date eine Genauigkeit von Millisekunden. Es kann also nur die ersten 3 Ziffern Ihres Sekundenbruchteils verarbeiten. Glücklicherweise ignoriert Joda-Time die zusätzlichen Nachkommastellen jedoch einfach, anstatt eine Ausnahme zu werfen.

String s = "2014-01-20T07:17:06.150995+00:00";
DateTime dateTime = new DateTime( s );
System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTime in UTC/GMT: " + dateTime.toDateTime( DateTimeZone.UTC ) );

Wenn ausgeführt…

dateTime: 2014-01-19T23:17:06.150-08:00
dateTime in UTC/GMT: 2014-01-20T07:17:06.150Z

java.time.* Klassen

Die neuen Klassen, die mit Java 8 gebündelt sind und im java.time.* Paket enthalten sind, ersetzen die Klassen java.util.Date & .Calendar. Sie sind von Joda-Time inspiriert, aber völlig neu konzipiert. JSR 310 definiert diese Klassen.

Diese neuen Klassen haben eine Genauigkeit von Nanosekunden anstelle von Millisekunden, sodass sie alle sechs Ihrer Nachkommastellen verarbeiten können. Wie Joda-Time akzeptieren sie einen ISO 8601-String direkt.

String s = "2014-01-20T07:17:06.150995+00:00";
ZonedDateTime zdt = ZonedDateTime.parse( s );

System.out.println( "zdt: " + zdt );

Wenn ausgeführt…

zdt: 2014-01-20T07:17:06.150995Z

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X