【问题标题】:Difference between System.setProperty("user.timezone", "America/Chicago"); and TimeZone.setDefault(TimeZone.getTimeZone("America/Chicago"));System.setProperty("user.timezone", "America/Chicago"); 之间的区别和 TimeZone.setDefault(TimeZone.getTimeZone("America/Chicago"));
【发布时间】:2012-08-10 18:18:14
【问题描述】:
  1. System.setProperty("user.timezone", "America/Chicago");
  2. TimeZone.setDefault(TimeZone.getTimeZone("America/Chicago"));

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

【问题讨论】:

    标签: java timezone


    【解决方案1】:

    查看代码,区别本质上是关于 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) 的情况下,正在设置类级别变量 defaultTimeZonedefaultTimeZone = zone; 并返回。

    【讨论】:

    • 你看了什么代码?我正在查看 System.java 和 TimeZone.java,但我无法理解你所说的。可以扩展一下吗?
    • 根据我在 java.util.TimeZone 类中看到的内容进行了更新。这是基于JDK 1.7源代码
    • 谢谢碧菊。 TimeZone 中的代码不是那么容易跟进,但我想我可以按照你所说的进行。你提到不应该有任何(巨大的)差异。我搜索了推荐的方法,但没有找到任何东西。你有没有碰巧看到任何 Sun/Oracle 推荐的设置时区的方法?
    【解决方案2】:

    最大的区别应该是“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());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-27
      • 2019-09-01
      • 2015-01-26
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      相关资源
      最近更新 更多