日期在美国服务器中返回错误的年份

use*_*834 0 java datetime

我正在英国开发代码,我正在格式化一个在英国工作正常的日期字段,当我将代码部署到美国的服务器上时,日期错误一年.这是代码

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);
} 
Run Code Online (Sandbox Code Playgroud)

在英国本地的Windows机器上,此代码正确输出:

2011-01-01T00:00:00Z
Run Code Online (Sandbox Code Playgroud)

在linux上的美国服务器上,相同的代码输出

2010-12-31T18:00:00Z
Run Code Online (Sandbox Code Playgroud)

它必须是某种时区问题?

ass*_*ias 6

您的模式以硬编码结束'Z',误导性地使您认为它不是UTC.如果您使用实时区域:

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z");
Run Code Online (Sandbox Code Playgroud)

(在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
Run Code Online (Sandbox Code Playgroud)