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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top