SimpleDateFormat的解析是一个小时后(使用RFC 1123 GMT夏)(SimpleD

2019-09-17 05:21发布

我使用的SimpleDateFormat与RFC 1123格式化日期,并解析日期。 然而,解析(格式(日期))有时不同于原始日期不同一小时。

下面的代码:

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]的工作。

据推测,它是GMT是否包括或不包括夏令混乱?

我使用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

编辑:按@奥斯卡castiblanco的评论,我已经把它改为new Date(1000)而不是使用1234ms。 同样的问题仍然发生。

Answer 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


Answer 2:

GMT没有夏令时。 在英国,我们赖以生存的“英国标准时间”,它有夏令时。 “格林威治标准时间”是世界基准时间,这没有夏令时。 然而,微软获得了这个错误,这有助于制造混乱。



文章来源: SimpleDateFormat parse is one hour out (using RFC 1123, GMT in summer)