我回顾了许多与Stackoverflow上的时区有关的问题,但是我找不到我正在努力的问题:
- 为什么JODA的
DateTimeZone.getDefault()
返回TZ Change上更新的时区(恢复应用程序后?)。TimeZone.getDefault()
似乎正常工作。 - 我应该使用
DateTimeZone.forTimeZone(TimeZone.getDefault())
来最新joda的DateTimeZone
对象吗?
这是复制的方法:
- 启动同时打印
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>
- 转到设置 ->将时区更改为pdt。
- 回到打印内容的应用程序(例如,在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" ,...]
- 在此阶段,我可以旋转该应用程序。
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 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 时具有更好的性能特性
- 它具有合适的广播接收器,可以跟踪系统时区的变化。