Календарные методы GregorianCalendar устанавливают дату на предыдущий день - PullRequest
1 голос
/ 06 апреля 2011

У меня странная проблема с абстрактным классом Calendar, использующим метод GregorianCalendar.

По какой-то причине использование "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();  

} Есть идеи?

Спасибо

Ответы [ 2 ]

5 голосов
/ 06 апреля 2011
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.

0 голосов
/ 06 апреля 2011

Календарь немного странный, как вы можете прочитать в его Javadoc; Суть в том, что вы должны вызывать calendare.get () после каждого вызова метода calendar.set (...), иначе изменение может быть непоследовательным.

...