繁体   English   中英

System.setProperty(“user.timezone”,“America / Chicago”)之间的区别;和TimeZone.setDefault(TimeZone.getTimeZone(“America / Chicago”));

[英]Difference between System.setProperty(“user.timezone”, “America/Chicago”); and TimeZone.setDefault(TimeZone.getTimeZone(“America/Chicago”));

  1. System.setProperty(“user.timezone”,“America / Chicago”);
  2. TimeZone.setDefault(TimeZone.getTimeZone( “美国/芝加哥”));

两者有什么区别? 哪一个更好/建议设置时区?

查看代码,差异主要在于TimeZone默认设置何时设置 -

在第一种情况下,默认在第一次调用TimeZone类时生效(基本上是懒惰的) - 比如TimeZone.getDefault() ,此时调用TimeZone.setDefaultuser.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)的情况下,正在设置类级别变量defaultTimeZonedefaultTimeZone = zone; 并返回。

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

请参阅Java SE 8 doc 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());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM