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:
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:
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 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 zuDate(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 einDate
. Daher wurden die Felder "calendar's
date-time" und "TimeZone
" je nach Unterklassenimplementierung möglicherweise überschrieben. Jeder WertTimeZone
, der zuvor durch einen Aufruf vonsetTimeZone
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).
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.
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.
Ich habe versucht, s1 und s2 durch das gleiche Programm zu vergleichen. sie kommen mir gleich.