我在英国开发代码,我正在格式化一个在英国运行正常的日期字段,当我将代码部署到美国的服务器上时,日期的年份是错误的一年。这是代码
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一定是时区问题吧?
发布于 2013-06-11 00:32:03
您的模式以硬编码的'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-11 00:28:41
区别只有一天..或者准确地说是几个小时
从2010年12月31日到2011年1月1日。由于英国的时间领先于美国
以毫秒为单位的时间,如1293840000000L,表示自1970年1月1日00:00:00.000 GMT以来经过的毫秒数。因此,英国和美国的相同值是不同的。
发布于 2013-06-11 00:33:06
Javadoc page for DateFormat说
日期表示为date对象或自1970年1月1日00:00:00 GMT以来的毫秒。
重点是我的。这意味着,如果您希望将日期指定为毫秒(长),则需要对任何时区计算负责。
https://stackoverflow.com/questions/17028579
复制相似问题