簡體   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