Joda Zeit gibt falsche Zeitzone
Frage
Ich bin mit der Joda Zeit (1.6) Bibliotheken und es hält Rückkehr Datetime Objekte mit der falschen Zeitzone, Britische Sommerzeit statt GMT.
Meine Windows-Workstation (Lauf JDK 1.6.0_16) denkt, dass es in GMT ist, und wenn ich die Standard-Zeitzone aus dem JDK Datum / Zeit-Klassen erhalten, ist es richtig, (GMT). Ich erhalte das gleiche Verhalten auf unseren als auch Linux-Servern. Ich dachte, es könnte ein Fehler in den Zeitzone-Datenbankdateien in Joda, damit ich das Glas mit der neuesten Datenbank neu erstellt, aber ohne Änderung.
import java.util.TimeZone;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalTime;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;
public class TimeZoneTest {
public static void main(String[] args) {
DateTimeFormatter timeParser = ISODateTimeFormat.timeParser();
TimeZone timeZone = TimeZone.getDefault();
System.out.println(timeZone.getID()); // "Europe/London"
System.out.println(timeZone.getDisplayName()); // "Greenwich Mean Time"
DateTimeZone defaultTimeZone = DateTimeZone.getDefault();
System.out.println(defaultTimeZone.getID()); //"Europe/London"
System.out.println(defaultTimeZone.getName(0L)); //"British Summer Time"
DateTime currentTime = new DateTime();
DateTimeZone currentZone = currentTime.getZone();
System.out.println(currentZone.getID()); //"Europe/London"
System.out.println(currentZone.getName(0L)); //"British Summer Time"
}
}
Debugging durch den statischen initialiser in org.joda.time.DateTimeZone
ich sehe, dass der System.getProperty("user.timezone")
Anruf "Europe/London"
gibt wie erwartet.
Lösung
Ok, an die Wurzel diesen Sie mit dem, was den britischen Sommerzeit tatsächlich Mitteln vertraut zu machen haben zu erhalten und wenn es an seinem Platz ist. Um es kurz zu machen passieren Sie 0L
zu getName()
die 1970-01-01T00:00:00Z
ist so DefaultTimeZone
den Namen der Zeitzone sucht in diesem Moment. Welches war Britische Sommerzeit.
Von: http: // www.nmm.ac.uk/explore/astronomy-and-time/time-facts/british-summer-time
Im Jahr 1968 Uhren waren erweitern 1 Stunde vor GMT am 18. Februar und so bis British Standard geblieben Zeit, in der Uhren gehalten wurden vorrücken von GMT das ganze Jahr, kam in Kraft zwischen 27. Oktober 1968 und 31 Oktober 1971.
Wenn Sie stattdessen in der richtigen Menge an Millisekunden seit 1970-01-01T00:00:00Z
passieren würde. z.B. indem
defaultTimeZone.getName(new GregorianCalendar().getTimeInMillis())
Sie würden auch die richtige Zeichenfolge bekommen. Im Grunde nur Sie die getName()
Methode der falsche Parameter so endete mit einem unerwarteten Ergebnis geführt.
Wenn Sie im Detail überprüfen möchten überprüfen Sie die Dateien in org/joda/time/tz/src
von joda Quelle zu sehen, wie joda Zeitzonen bestimmt.
Anstelle von
defaultTimeZone.getName(0L)
Sie konnten verwenden
defaultTimeZone.toTimeZone().getDisplayName()
was bedeutet es für mich.
Andere Tipps
Es kann Sie interessiert die statische initialiser für die DateTimeZone Klasse in 1,6 zu sehen:
static {
setProvider0(null);
setNameProvider0(null);
try {
try {
cDefault = forID(System.getProperty("user.timezone"));
} catch (RuntimeException ex) {
// ignored
}
if (cDefault == null) {
cDefault = forTimeZone(TimeZone.getDefault());
}
} catch (IllegalArgumentException ex) {
// ignored
}
if (cDefault == null) {
cDefault = UTC;
}
}
Meine Vermutung ist, dass Sie eine user.timezone
Eigenschaft definiert (und auf BST) haben. Ansonsten sieht es aus wie Joda sollte seine eigene Zeitzone Instanz basierend auf der JDK Zeitzone schaffen; und ich würde irgendwelche Fehler in diesem Bereich erwartet, insbesondere eine GMT-Zone umzuwandeln, nahm wurde mittlerweile würde.