我正在英国开发代码,我正在格式化一个在英国工作正常的日期字段,当我将代码部署到美国的服务器上时,日期错误一年.这是代码
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)
它必须是某种时区问题?
您的模式以硬编码结束'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)
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |