[英]Date is returning the wrong year in US server
我正在英國開發代碼,正在格式化一個在英國可以正常工作的日期字段,當我將代碼部署到美國的服務器上時,日期錯誤一年。 這是代碼
public static void main(String args[]) {
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
String dateStr = sdf.format(1293840000000L);
System.out.println(dateStr);
}
在英國本地的Windows計算機上,此代碼正確輸出:
2011-01-01T00:00:00Z
在Linux上的美國服務器上,相同的代碼輸出
2010-12-31T18:00:00Z
一定是時區問題嗎?
您的模式以硬編碼的'Z'
結尾,這會誤導您使您認為它不是UTC。 如果您使用實時區域:
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z");
(在Z周圍沒有引號),您會看到差異只是時區偏移。
這是一個重現此問題的示例,這是由於SimpleDateFormat
使用默認時區的事實所致:
Date dt = new Date(1293840000000L);
TimeZone.setDefault(TimeZone.getTimeZone("America/Chicago"));
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z");
String dateStr = sdf.format(dt);
System.out.println(dateStr); //prints 2010-12-31T18:00:00 -0600
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z");
dateStr = sdf.format(dt);
System.out.println(dateStr); //prints 2011-01-01T00:00:00 +0000
區別只是一天..確切地說是幾個小時
從2010年12月31日至2011 年 1月1日 。 由於英國的時間領先於美國
以毫秒為單位的時間(例如1293840000000L
表示自格林威治標准時間1970年1月1日00:00:00.000起經過的毫秒數。 因此,英國和美國的相同價值有所不同。
日期用Date對象或自格林尼治標准時間1970年1月1日00:00:00以來的毫秒數表示。
強調我的。 這意味着如果要將日期指定為毫秒(長),則您要負責任何時區計算。
看起來像是時區差異。 美國比英國落后幾個小時(確切的差異取決於您所在的位置)。
在這種情況下,相差六個小時。 我相信這是格林尼治標准時間(CST)到GMT的時間,因此您的用戶使用的語言環境設置可能不同。 這表示字符串正確。 如果要使用相同的字符串,則需要更改語言環境或確保要打印GMT偏移量。
例如, DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.