3

多くのデバッグを行った後、問題を次のスニペットに絞り込みました。

public static void calendarBug() {
    for (int i=0 ; i<6 ; i++) {
        Calendar c = Calendar.getInstance();
        c.clear();
        c.set(2015, 2, 27, i, 0);
        System.out.println(c.getTime());
    }
}

これを実行すると、次の出力が得られます。

Fri Mar 27 00:00:00 IST 2015
Fri Mar 27 01:00:00 IST 2015
Fri Mar 27 03:00:00 IDT 2015
Fri Mar 27 03:00:00 IDT 2015
Fri Mar 27 04:00:00 IDT 2015
Fri Mar 27 05:00:00 IDT 2015

の代わりにc.set(2015,2,27,2,0)戻る理由を知っている人はいますか?3AM2AM

4

2 に答える 2

7

ちょうど DST 時間にいると考えてみてください。この時間部分を生きずに、1 時間進むか 1 時間戻ります。

バグではなく、機能です。

DST を使用しないタイムゾーン (たとえば、カナダ/イースト サスカチュワン) を変更すると、期待どおりの結果が得られます。

ここに例があります。

public static void calendarBug() {
    for (int i=0 ; i<6 ; i++) {
        Calendar c = Calendar.getInstance();

        c.setTimeZone(TimeZone.getTimeZone("Canada/East-Saskatchewan"));
        c.clear();
        c.set(2015, 2, 27, i, 0);
        System.out.println(c.getTime());
    }
}

Fri Mar 27 08:00:00 EET 2015
Fri Mar 27 09:00:00 EET 2015
Fri Mar 27 10:00:00 EET 2015
Fri Mar 27 11:00:00 EET 2015
Fri Mar 27 12:00:00 EET 2015
Fri Mar 27 13:00:00 EET 2015
于 2014-04-30T13:34:27.257 に答える
6

これは、タイムゾーンの DST 切り替えである可能性が最も高いです。

3 月 27 日は 2015 年 3 月の最後の金曜日です。これは、イスラエル、ヨルダン、シリア、ヨルダン川西岸などで DST の切り替えが行われる日です。

見る

于 2014-04-30T13:25:20.567 に答える