我正在英国开发代码,我正在格式化一个在英国正常运行的日期字段,当我将代码部署到美国的服务器上时,日期的年份是错误的一年。这是代码
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
一定是某种时区问题?
答案 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)
强调我的。这意味着如果您想将日期指定为毫秒(长),则您负责任何时区计算。日期表示为Date对象或自1970年1月1日00:00:00 GMT以来的毫秒。
答案 3 :(得分:1)
看起来像是时区差异。美国落后英国几个小时(确切的差异取决于你的位置,具体而言)。
在这种情况下,这是一个六小时的差异。我相信这是CST到GMT,所以你的用户有不同的区域设置。这意味着字符串是正确的。如果您想要相同的字符串,则需要更改区域设置或确保打印GMT偏移量。
例如,DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");