Java System.setProperty(“user.timezone”和“America/Chicago”之间的差异;和TimeZone.setDefault(TimeZone.getTimeZone(“America/Chicago”); System.setProperty(“用户时区”、“美国/芝加哥”) TimeZone.setDefault(TimeZone.getTimeZone(“美国/芝加哥”)
这两者的区别是什么?设置时区时,哪一个更好/推荐?查看代码,区别主要在于何时设置时区默认值- 在第一种情况下,默认值在第一次调用TimeZone类时生效(基本上是惰性的)-例如Java System.setProperty(“user.timezone”和“America/Chicago”之间的差异;和TimeZone.setDefault(TimeZone.getTimeZone(“America/Chicago”); System.setProperty(“用户时区”、“美国/芝加哥”) TimeZone.setDefault(TimeZone.getTimeZone(“美国/芝加哥”),java,timezone,Java,Timezone,这两者的区别是什么?设置时区时,哪一个更好/推荐?查看代码,区别主要在于何时设置时区默认值- 在第一种情况下,默认值在第一次调用TimeZone类时生效(基本上是惰性的)-例如TimeZone.getDefault(),此时调用TimeZone.setDefault,查找user.TimeZone,并设置默认值 在第二个场景中,当您显式调用TimeZone.setDefault 我认为这是唯一的区别,两者在实践中都应该很好 更新 这是来自java.util.TimeZone类的代码 对TimeZ
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代码>并返回。最大的区别应该是“user.timezone”属性和时区的默认时区分别存储
参见JavaSE8文档
主要的一点是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"));
例如,它取决于“user.timezone”属性和timezone.getDefault
,并且“user.timezone”优先。见:
你看的是什么代码?我在看System.java和TimeZone.java,但我听不懂你说的。您可以展开吗?根据我在java.util.TimeZone
类中看到的内容进行更新。这是基于JDK1.7源代码的。时区中的代码不是那么容易跟进,但我想我可以理解你所说的。你提到不应该有任何(剧烈的)区别。我在谷歌上搜索了一个推荐的方法,但什么也没找到。您是否碰巧看到Sun/Oracle推荐的设置时区的方法?
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());
}