3

我使用 SimpleDateFormat 和 RFC 1123 来格式化日期和解析日期。但是, parse(format(date)) 有时与原始日期相差一小时。

下面的代码:

public static void main(String[] args) throws ParseException {
    String RFC1123_DATE_PATTERN = "EEE, dd MMM yyyy HH:mm:ss zzz";
    SimpleDateFormat dateFormat = new SimpleDateFormat(RFC1123_DATE_PATTERN);

    Date date = new Date(1000);
    String str = dateFormat.format(date);
    Date date2 = dateFormat.parse(str);

    System.out.println("date="+date+"; "+date.getTime());
    System.out.println("str="+str);
    System.out.println("date2="+date2+"; "+date2.getTime());
}

写出:

date=Thu Jan 01 01:00:01 GMT 1970; 1000
str=Thu, 01 Jan 1970 01:00:01 GMT
date2=Thu Jan 01 02:00:01 GMT 1970; 3601000

我从 apache.http.util.DateUtil 得到了这个模式,所以希望它能够工作 [1]。

据推测,格林威治标准时间是否包括或不包括夏令时?

我正在使用 Java(TM) SE 运行时环境(构建 1.6.0_31-b04-415-10M3646,也在 1.7.0_71 上测试过)。


一种解决方法是使用模式“EEE,dd MMM yyyy HH:mm:ss Z”,它给出:

date=Thu Jan 01 01:00:01 GMT 1970; 1000
str=Thu, 01 Jan 1970 01:00:01 +0100
date2=Thu Jan 01 01:00:01 GMT 1970; 1000

[1] http://www.docjar.com/html/api/org/apache/http/util/DateUtils.java.html

编辑:根据@oscar-castiblanco 的评论,我已将其更改为new Date(1000),而不是使用 1234ms。同样的问题仍然发生。

4

2 回答 2

1

我尝试了第一个模式“EEE,dd MMM yyyy HH:mm:ss zzz”,我得到了这个答案

date=Thu Jan 01 01:00:01 CET 1970; 1234
str=Thu, 01 Jan 1970 01:00:01 CET
date2=Thu Jan 01 01:00:01 CET 1970; 1000

我尝试了第二种模式,得到了相同的答案。

为了在两种情况下都有相同的时间,我将缺少的转换毫秒添加到模式中:

模式 = “EEE,dd MMM yyyy HH:mm:ss:SSS Z”

date=Thu Jan 01 01:00:01 CET 1970; 1234
str=Thu, 01 Jan 1970 01:00:01:234 +0100
date2=Thu Jan 01 01:00:01 CET 1970; 1234
于 2012-05-14T14:12:18.113 回答
0

GMT 没有夏令时。在英国,我们按照夏令时的“英国标准时间”生活。“格林威治标准时间”是世界参考时间,没有夏令时。然而,微软犯了这个错误,这助长了混乱。

于 2014-02-10T15:07:16.020 回答