首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >日期在美国服务器中返回错误的年份

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

Stack Overflow用户
提问于 2013-06-11 00:26:38
回答 4查看 132关注 0票数 0

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

代码语言:javascript
复制
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机器上,此代码正确输出:

代码语言:javascript
复制
2011-01-01T00:00:00Z

在美国的服务器上的linux机器上,同样的代码输出

代码语言:javascript
复制
2010-12-31T18:00:00Z

一定是时区问题吧?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-06-11 00:32:03

您的模式以硬编码的'Z'结尾,这会误导您,使您认为它是UTC,而事实并非如此。如果您使用实时时区:

代码语言:javascript
复制
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z");

(Z两边没有引号)您将看到差异只是一个时区偏移。

下面是一个重现该问题的示例,这是由于SimpleDateFormat使用默认时区造成的:

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2013-06-11 00:28:41

区别只有一天..或者准确地说是几个小时

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

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

票数 3
EN

Stack Overflow用户

发布于 2013-06-11 00:33:06

Javadoc page for DateFormat

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

重点是我的。这意味着,如果您希望将日期指定为毫秒(长),则需要对任何时区计算负责。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17028579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档