【发布时间】:2012-08-10 18:18:14
【问题描述】:
- System.setProperty("user.timezone", "America/Chicago");
- TimeZone.setDefault(TimeZone.getTimeZone("America/Chicago"));
两者有什么区别?哪个更好/推荐用于设置时区?
【问题讨论】:
两者有什么区别?哪个更好/推荐用于设置时区?
【问题讨论】:
查看代码,区别本质上是关于 TimeZone 默认设置的时间 -
在第一种情况下,默认值在第一次调用 TimeZone 类时生效(基本上是懒惰的) - 比如说 TimeZone.getDefault() ,此时 TimeZone.setDefault 被调用,user.timezone 被查找并默认设置好了。
在第二种情况下,急切地设置默认值 - 当您显式调用TimeZone.setDefault时
我认为这是唯一的区别,任何一个在实践中都应该可以正常工作。
更新
这是来自java.util.TimeZone 类的代码
第一次调用 TimeZone.getDefault() 有这个流程,它涵盖了你的第一点。
TimeZone.getDefault()
-> TimeZone.setDefaultZone() (lookup "user.timezone" , set class variable and return timezone)
-> return defaulttimezone
下次调用 getDefault() 时,它只是返回类变量
在 TimeZone.setDefault(timeZone) 的情况下,正在设置类级别变量 defaultTimeZone:
defaultTimeZone = zone; 并返回。
【讨论】:
java.util.TimeZone 类中看到的内容进行了更新。这是基于JDK 1.7源代码
最大的区别应该是“user.timezone”属性和TimeZone的默认时区是分开存储的。
请参阅 Java SE 8 文档 TimeZone#getDefault、TimeZone#setDefault。
主要的一点是TimeZone.getDefault 可以使用“user.timezone”属性作为它的初始值,但是这个值会被缓存。这意味着对“user.timezone”的更改不会影响TimeZone.getDefault。并且TimeZone.setDefault 不会更改“user.timezone”属性。
如果您不确定您的代码或第三方库依赖于哪一个,您最好同时设置:
System.setProperty("user.timezone", "America/Chicago");
TimeZone.setDefault(null); // or TimeZone.setDefault(TimeZone.getTimeZone("America/Chicago"));
以Joda Time为例,它依赖于“user.timezone”属性和TimeZone.getDefault,“user.timezone”优先。见DateTiimeZone.getDefault:
try {
String id = System.getProperty("user.timezone");
if (id != null) { // null check avoids stack overflow
zone = forID(id);
}
} catch (RuntimeException ex) {
// ignored
}
if (zone == null) {
zone = forTimeZone(TimeZone.getDefault());
}
【讨论】: