SimpleDateFormat Zeitzone Bug auf Android

8

Ich habe versucht, einen Fehler in meiner Anwendung zu isolieren. Es ist mir gelungen, folgendes "Rätsel" zu erzeugen:

%Vor%

Ich erhalte die Werte in Kommentaren, wenn ich diesen Code auf der Android API 7 ausführe (ja, wirklich). Dieses Verhalten hängt von einer bestimmten Java-Implementierung ab.

Meine Fragen sind:

  • Warum ist s1 nicht gleich s2?
  • Und noch wichtiger, warum s1 falsch ist? Während s2 auf einen richtigen Zeitpunkt verweist, tut s1 das nicht. Es scheint einen Fehler in der SimpleDateFormat-Implementierung von Android zu geben.

ANTWORT AUF FRAGE 1: Siehe die Antwort von BalusC:

  • [Nach der Verwendung von SimpleDateFormat#parse ] muss möglicherweise ein TimeZone-Wert, der zuvor durch einen Aufruf von setTimeZone festgelegt wurde, für weitere Operationen wiederhergestellt werden.

ANTWORT AUF FRAGE 2: Siehe die Antwort von wrygiel (mich selbst).

  • Dies ist auf einen Fehler in Android 2.1 (API 7) zurückzuführen.
wrygiel 16.05.2012, 18:47
quelle

4 Antworten

7

Dies wird in Javadoc von DateFormat#parse() :

  

Analysiert eine Datums- / Uhrzeit-Zeichenfolge gemäß der angegebenen Syntaxposition. Zum Beispiel wird ein Zeittext "07/10/96 4:5 PM, PDT" in ein Datum geparst, das äquivalent zu Date(837039900000L) ist.

     

Standardmäßig ist das Parsen nachsichtig: Wenn die Eingabe nicht in der Form ist, die von der format-Methode dieses Objekts verwendet wird, aber immer noch als Datum analysiert werden kann, ist die Syntaxanalyse erfolgreich. Kunden können auf die strikte Einhaltung des Formats bestehen, indem sie setLenient(false) .

     

Dieser Parsing-Vorgang verwendet die calendar Erzeuge ein Date . Daher wurden die Felder " calendar's date-time" und " TimeZone " je nach Unterklassenimplementierung möglicherweise überschrieben. Jeder Wert TimeZone , der zuvor durch einen Aufruf von setTimeZone muss möglicherweise für weitere Operationen wiederhergestellt werden.

Beachten Sie den letzten Absatz. Es erklärt leider nicht wenn genau dies geschieht. Um Ihr spezielles Problem zu beheben, müssen Sie vor dem Formatierungsvorgang explizit die gewünschte Zeitzone festlegen.

Was die Veränderlichkeit von SimpleDateFormat selbst betrifft, ist dies seit Jahren bekannt. Sie sollten niemals eine Instanz davon als statische oder Klassenvariable erstellen und zuweisen, sondern immer als Methodenvariable (threadlocal).

    
BalusC 16.05.2012, 18:56
quelle
5

Dies liegt an einem Fehler in Android 2.1 (API 7). Es scheint, dass Android-Programmierer etwas undokumentiertes Java-Verhalten verpasst haben (was selbst als unfixierbarer Fehler eingestuft wird!). ) in ihrer Umsetzung von Android 2.1.

    
wrygiel 16.05.2012 20:09
quelle
0

Deine Frage hat mich fasziniert, also habe ich deinen Code kompiliert. Das Ergebnis? Wie erwartet ...

%Vor%

Die zwei Werte sind die gleichen, verwenden Sie etwas Nebenläufigkeit? Vielleicht wird die Variable in einem anderen Thread direkt vor dem f2.format(d) geändert.

    
alegen 16.05.2012 18:54
quelle
0

Ich habe versucht, s1 und s2 durch das gleiche Programm zu vergleichen. sie kommen mir gleich.

    
Sukesh Kumar 16.05.2012 19:05
quelle

Tags und Links