1

GregorianCalendarメソッドを使用した抽象Calendarクラスで奇妙な問題が発生しています。

何らかの理由で「calendar.set」を使用すると、前日からの日付が返されます。たとえば、正常に機能する場所と問題が発生する場所についてのコメントを含む以下のコードを参照してください。

private Date checkDate(Date d, int hour, int minute, int sec, int milliSec)
{
    // Test values for arguments
    d = "Wed Apr 06 00:00:00 BST 2011";
    hour = minute = sec = milliSec = 0;

    Calendar calendar = new GregorianCalendar(sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]);
    calendar.setTime(d);

    // *** OK *** calendar.getTime() will display correctly here (Wed Apr 06 00:00:00 BST 2011)

    calendar.set(Calendar.HOUR_OF_DAY, hour);
    calendar.set(Calendar.MINUTE, minute);
    calendar.set(Calendar.SECOND, sec);
    calendar.set(Calendar.MILLISECOND, milliSec);

    // *** NOT OK *** calendar.getTime() will display inncorrectly here (Tue Apr 05 01:00:00 BST 2011)


return calendar.getTime();  

} 何か案は?

ありがとう

4

2 に答える 2

5
Calendar calendar = new GregorianCalendar(sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]);
calendar.setTime(d);

わかりました。タイムゾーンが UTC に設定されたカレンダーがあり、時刻が

Wed Apr 06 00:00:00 BST 2011.

内部的には、これはにマッピングされます

2011-04-05 23:00:00 UTC(日付と時刻が採用され、タイムゾーンが保持されます)。

カレンダーの時、分、秒、ミリ秒のフィールドを 0 に設定すると、次のように変更されます。

2011-04-05 00:00:00 UTC.

カレンダーをjava.util.Dateオブジェクトに変換し、ローカル タイム ゾーン (BST) を考慮して印刷すると、出力は次のようになります。

2011-04-05 01:00:00 BST.

于 2011-04-06T14:45:14.447 に答える
0

javadoc で読めるように、Calendar は少し奇妙です。肝心なのは、calendar.set(...) を呼び出すたびに calendare.get() を呼び出す必要があることです。そうしないと、変更に一貫性がなくなる可能性があります。

于 2011-04-06T14:04:37.763 に答える