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

时间:2013-06-10 16:26:38

标签: 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);
} 

在Windows机器上的本地U.K中,此代码正确输出:

2011-01-01T00:00:00Z

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

2010-12-31T18:00:00Z

一定是某种时区问题?

4 个答案:

答案 0 :(得分:6)

您的模式以硬编码'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

答案 1 :(得分:3)

差异只是一天......或者确切地说是几个小时

2010年12月31日 2011年1月1日。由于英国的时间领先于美国

1293840000000L这样的以毫秒为单位的时间表示自1970年1月1日00:00:00.000 GMT以来经过的毫秒数。因此,英国和美国的价值相同。

答案 2 :(得分:1)

Javadoc page for DateFormat

  

日期表示为Date对象或自1970年1月1日00:00:00 GMT以来的毫秒

强调我的。这意味着如果您想将日期指定为毫秒(长),则您负责任何时区计算。

答案 3 :(得分:1)

看起来像是时区差异。美国落后英国几个小时(确切的差异取决于你的位置,具体而言)。

在这种情况下,这是一个六小时的差异。我相信这是CST到GMT,所以你的用户有不同的区域设置。这意味着字符串是正确的。如果您想要相同的字符串,则需要更改区域设置或确保打印GMT偏移量。

例如,DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");