为什么DateTimeZone.getDefault()更改Android中的区域时不会更新



我回顾了许多与Stackoverflow上的时区有关的问题,但是我找不到我正在努力的问题:

  • 为什么JODA的DateTimeZone.getDefault()返回TZ Change上更新的时区(恢复应用程序后?)。 TimeZone.getDefault()似乎正常工作
  • 我应该使用 DateTimeZone.forTimeZone(TimeZone.getDefault())来最新joda的 DateTimeZone对象吗?

这是复制的方法:

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

09-15 16:46:59.512 14961-14961/com.example.android.thy d/timezone: dateTimeZone.getDefault()=欧洲/伦敦; timeZone.getDefault()= libcore.util.zoneinfo [id ="欧洲/伦敦" ,...]P>

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

09-15 08:49:24.727 14961-14961/com.example.android. D/TimeZone: dateTimeZone.getDefault()=欧洲/伦敦; TimeZone.getDefault()libcore.util.util.zoneinfo [id =" America/los_angeles" ,...]

  1. 在此阶段,我可以旋转该应用程序。DateTimeZone.getDefault()将被卡住。
  2. 只有在应用程序之后 - 值正确。

为什么这样?

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 default = America/sao_paulo
joda默认=美国/sao_paulo
JVM默认值=欧洲/伦敦
joda默认=美国/sao_paulo
true

还请注意,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 default =欧洲/伦敦
false

重新启动所有内容后,缓存消失,Joda Time首次称为新默认值。

您不应该直接使用joda time,但最好使用Daniel Lew 的库(Jodatimeandroid- Joda Time周围的薄包装器),因为

  • 将TZ数据加载到Android
  • 时具有更好的性能特性
  • 它具有合适的广播接收器,可以跟踪系统时区的变化。

相关内容

  • 没有找到相关文章

最新更新