2017-09-15 3 views
4

mir viele Fragen im Zusammenhang mit Timezones auf Stackoverflow, aber ich konnte nicht finden, die man auf das Problem Ich kämpfe mit Bewertung:Warum DateTimeZone.getDefault() nicht aktualisiert, wenn Zone in Android geändert wird

  • Warum gibt Jodas DateTimeZone.getDefault() aktualisierte Zeitzone bei TZ-Änderung (nach dem Fortsetzen einer Anwendung?) Zurück. TimeZone.getDefault() scheint gut zu funktionieren.
  • Sollte ich verwenden, um Jodas DateTimeZone Objekt auf den neuesten Stand zu bekommen?

Hier ist, wie zu replizieren:

  1. starten App, die sowohl DateTimeZone.getDefault() druckt und TimeZone.getDefault():

09-15 16: 46: 59,512 14.961-14.961/com .beispiel.android.whatever D/Zeitzone: DateTimeZone.getDefault() = Europe/London;TimeZone.getDefault() = libcore.util.ZoneInfo [id = "Europa/London", ...]

  1. Gehen Sie zu Einstellungen -> Zeitzone ändern zu PDT.
  2. to Application Gehen Sie zurück, die Sachen (zB in onResume()) druckt:

09-15 08: 49: 24,727 14.961-14.961/com.example.android.whatever D/Zeitzone: DateTimeZone.getDefault() = Europa/London; TimeZone.getDefault() libcore.util.ZoneInfo [id = "Amerika/Los_Angeles", ...]

  1. In dieser Phase I die rotieren kann App. Die DateTimeZone.getDefault() wird feststecken.
  2. Nur nach der Anwendung onRestart - der Wert wird korrekt sein.

Warum ist es so?

Antwort

3

Joda-Time speichert die Standardzeitzone zwischen.

Wenn Sie diesen Code ausführen (in meiner JVM, die Standard-Zeitzone ist America/Sao_Paulo):

System.out.println("JVM default=" + TimeZone.getDefault().getID()); // America/Sao_Paulo 
DateTimeZone t1 = DateTimeZone.getDefault(); 
System.out.println("Joda Default=" + t1); // America/Sao_Paulo 

// setting the default timezone to London 
TimeZone.setDefault(TimeZone.getTimeZone("Europe/London")); 
System.out.println("JVM default=" + TimeZone.getDefault().getID()); // Europe/London 
DateTimeZone t2 = DateTimeZone.getDefault(); 
System.out.println("Joda Default=" + t2); // America/Sao_Paulo 
System.out.println(t1 == t2); // true 

Der Ausgang wird sein:

JVM default = America/Sao_Paulo
Joda Standard = Amerika/Sao_Paulo
JVM default = Europa/London
Joda Standard = Amerika/Sao_Paulo
true

Beachten Sie auch, dass t1 == t2 kehrt true, das heißt, sie genau dieselbe Instanz sind.

Um Joda der Standardzeitzone eingestellt, nachdem die JVM Standard ändern, müssen Sie es in DateTimeZone setzen:

// change Joda's default timezone to be the same as the JVM's 
DateTimeZone.setDefault(DateTimeZone.forTimeZone(TimeZone.getDefault())); 
DateTimeZone t3 = DateTimeZone.getDefault(); 
System.out.println("Joda Default=" + t3); // Europe/London 
System.out.println(t1 == t3); // false 

Diese Ausgänge:

Joda Standard = Europe/London
falsch

Nach dem Neustart alles verschwindet der Cache und Joda-Time bekommt die neue d Standard beim ersten Aufruf.

3

Sie sollten nicht direkt Joda-Time verwenden, aber besser die Bibliothek von Daniel Lew (JodaTimeAndroid - eine dünne Hülle um Joda-Time) verwenden, da

  • es bessere Leistungseigenschaften aufweist, wenn die tz Daten geladen werden auf Android
  • hat es einen geeigneten Broadcast-Empfänger, um Änderungen der system timezone zu verfolgen.
Verwandte Themen