gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:20 26 4
gpt4 key购买 nike

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

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

复制方法如下:

  1. 启动打印 DateTimeZone.getDefault()TimeZone.getDefault() 的应用:

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

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

09-15 08:49:24.727 14961-14961/com.example.android.whatever D/TimeZone: DateTimeZone.getDefault()=Europe/London; TimeZone.getDefault()libcore.util.ZoneInfo[id="America/Los_Angeles",...]

  1. 在这个阶段,我可以轮换应用程序。 DateTimeZone.getDefault() 将被卡住。
  2. 只有在应用 onRestart 之后 - 值才会正确。

为什么会这样?

最佳答案

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 Default=America/Sao_Paulo
JVM default=Europe/London
Joda Default=America/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=Europe/London
false

重启一切后,缓存消失,Joda-Time 在首次调用时获得新的默认值。

关于java - 为什么在更改 Android 中的区域时 DateTimeZone.getDefault() 不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46243649/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com