两者有什么区别?哪一个更适合/建议设置时区?
答案 0 :(得分:1)
查看代码,差异主要在于TimeZone默认设置何时设置 -
在第一种情况下,默认值在第一次调用TimeZone类时生效(基本上是懒惰的) - 比如说TimeZone.getDefault()
,此时TimeZone.setDefault
被调用,user.timezone
查找并设置默认值。
在第二种情况下,当您明确调用TimeZone.setDefault
我认为这是唯一的区别,要么在实践中应该做得很好。
<强>更新强>
这是来自java.util.TimeZone
class
第一次调用TimeZone.getDefault()有这个流程,它涵盖了你的第一点。
TimeZone.getDefault()
-> TimeZone.setDefaultZone() (lookup "user.timezone" , set class variable and return timezone)
-> return defaulttimezone
下次调用getDefault()时,它只返回类变量
对于TimeZone.setDefault(timeZone),正在设置类级变量defaultTimeZone
:
defaultTimeZone = zone;
并返回。
答案 1 :(得分:0)
最大的区别应该是“user.timezone”属性和TimeZone的默认时区是分开存储的。
请参阅Java SE 8 doc 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());
}