0

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

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

一定是某种时区问题?

4

4 回答 4

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
于 2013-06-10T16:32:03.067 回答
3

The difference is just one day.. or to be precise few hours

from 31st Dec 2010 to 1st Jan 2011. Since UK's time is ahead of US

A time in milliseconds like 1293840000000L represents the number of milliseconds that have passed since January 1, 1970 00:00:00.000 GMT. So, the same value for UK and US differs.

于 2013-06-10T16:28:40.573 回答
1

DateFormat的Javadoc 页面说

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

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

于 2013-06-10T16:33:05.570 回答
1

它看起来像一个时区差异。美国比英国晚几个小时(具体差异取决于您所在的位置)。

在这种情况下,相差六个小时。我相信这是 CST 到 GMT,所以您的用户可能有不同的语言环境集。这意味着字符串是正确的。如果您想要相同的字符串,则需要更改语言环境或确保打印 GMT 偏移量。

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

于 2013-06-10T16:33:08.743 回答