我复习了许多与StackOverflow上的TimeZones相关的问题,但是找不到我所遇到的问题之一:
DateTimeZone.getDefault()
不会在TZ更改时返回更新的时区(恢复应用程序后?)。 TimeZone.getDefault()
似乎可以正常工作。 DateTimeZone.forTimeZone(TimeZone.getDefault())
来获取最新的Joda的DateTimeZone
对象吗? 以下是复制方法:
DateTimeZone.getDefault()
和TimeZone.getDefault()
的应用程序:09-15 16:46:59.512 14961-14961 / com.example.android.whatever D / TimeZone:
DateTimeZone.getDefault()=欧洲/伦敦; TimeZone.getDefault()= libcore.util.ZoneInfo [id =“Europe / London” ,...]
09-15 08:49:24.727 14961-14961 / com.example.android.whatever
D / TimeZone: DateTimeZone.getDefault()=欧洲/伦敦;
TimeZone.getDefault()libcore.util.ZoneInfo [id =“America / Los_Angeles” ,...]
DateTimeZone.getDefault()
将被卡住。 为什么会这样呢?
最佳答案
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默认=美国/ Sao_Paulo
JVM默认=欧洲/伦敦
Joda默认=美国/ 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在首次调用时将获得新的默认值。