8
  1. System.setProperty("user.timezone", "美国/芝加哥");
  2. TimeZone.setDefault(TimeZone.getTimeZone("美国/芝加哥"));

两者有什么区别?哪个更好/推荐用于设置时区?

4

2 回答 2

2

查看代码,区别本质上是关于 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;并返回。

于 2012-08-10T20:22:42.407 回答
1

最大的区别应该是“user.timezone”属性和TimeZone的默认时区是分开存储的。

请参阅 Java SE 8 文档TimeZone#getDefaultTimeZone#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());
}
于 2017-09-09T16:04:48.970 回答