3

RFC 1123 で SimpleDateFormat を使用して日付をフォーマットし、日付を解析しています。ただし、parse(format(date)) は元の日付と 1 時間異なる場合があります。

以下のコード:

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 Runtime Environment (ビルド 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

2 番目のパターンを試してみましたが、同じ答えが得られました。

両方のケースで同じ時間を得るために、不足している変換のミリ秒をパターンに追加します。

pattern = "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 にはサマータイムがありません。ここ英国では、夏時間がある「英国標準時」に従って生活しています。「グリニッジ標準時」は、夏時間のない世界基準時間です。しかし、Microsoft はこれを誤解しており、混乱の種をまき散らしています。

于 2014-02-10T15:07:16.020 に答える