簡體   English   中英

日期在美國服務器中返回錯誤的年份

[英]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起經過的毫秒數。 因此,英國和美國的相同價值有所不同。

DateFormatJavadoc頁面

日期用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM