[英]Difference between System.setProperty(“user.timezone”, “America/Chicago”); and TimeZone.setDefault(TimeZone.getTimeZone(“America/Chicago”));
兩者有什么區別? 哪一個更好/建議設置時區?
查看代碼,差異主要在於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;
並返回。
最大的區別應該是“user.timezone”屬性和TimeZone的默認時區是分開存儲的。
請參閱Java SE 8 doc TimeZone#getDefault , TimeZone #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.