为什么在更改Android中的区域时{Date}发生更改

时间:2017-09-15 16:04:55

标签: java android datetime timezone jodatime

我在Stackoverflow上回顾了很多与TimeZones相关的问题,但我找不到我正在努力解决的问题:

  • 为什么Joda的DateTimeZone.getDefault()不会在TZ上更新更新时区(恢复申请后?)。 TimeZone.getDefault()似乎工作得很好
  • 我应该使用DateTimeZone.forTimeZone(TimeZone.getDefault())来了解Joda的DateTimeZone对象吗?

以下是如何复制:

  1. 启动同时打印DateTimeZone.getDefault()TimeZone.getDefault()的应用
  2.   

    09-15 16:46:59.512 14961-14961 / com.example.android.whatever D / TimeZone:    DateTimeZone.getDefault()=欧洲/伦敦; TimeZone.getDefault()= libcore.util.ZoneInfo [id =“Europe / London”,...]

    1. 转到设置 - >将时区更改为PDT。
    2. 返回打印内容的应用程序(例如在onResume()中):
    3.   

      09-15 08:49:24.727 14961-14961 / com.example.android.whatever   D / TimeZone: DateTimeZone.getDefault()=欧洲/伦敦;   的 TimeZone.getDefault()libcore.util.ZoneInfo [ID = “美国/洛杉矶”下,...]

      1. 在这个阶段我可以旋转App。 DateTimeZone.getDefault()将被卡住。
      2. 仅在申请onRestart后 - 该值才是正确的。
      3. 为什么会这样?

2 个答案:

答案 0 :(得分:3)

Joda-Time缓存默认时区。

如果您运行此代码(在我的JVM中,默认时区为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

输出将是:

  

JVM默认= America / Sao_Paulo
  Joda默认= America / Sao_Paulo
  JVM默认=欧洲/伦敦
  Joda默认= America / Sao_Paulo
  真

另请注意,t1 == t2会返回true,这意味着它们是完全相同的实例。

要在更改JVM默认值后设置Joda的默认时区,您必须在DateTimeZone中设置它:

// 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

输出:

   Joda默认=欧洲/伦敦
  假

重新启动所有内容后,缓存消失,Joda-Time在首次调用时获得新的默认值。

答案 1 :(得分:3)

你不应该直接使用Joda-Time,而是更好地使用Daniel Lew的库JodaTimeAndroid - 一个围绕Joda-Time的薄包装器),因为

  • 在Android上加载tz数据时具有更好的性能特征
  • 它有一个合适的广播接收器来跟踪system timezone
  • 的变化