2015-03-09 2 views
0

Если у меня есть дата 2015-03-07 02:00:00 -0500, и я добавляю 1 день к ней (время меняется от 2 до 3 марта 8). Я получаю неправильное значение обратно в результирующей Календарь:Java Calendar DST advance issue/bug

перед добавлением 1 день: 2015-03-07 02:00:00 -0500

После добавления 1 день: 2015-03-08 01:00: 00 -0500

День был скорректирован, выполнив следующую строку кода:

 System.out.println("Before Adding 1 Day: " + getFormattedDate(cal)); 
     cal.add(Calendar.DATE, 1); 
     System.out.println("After Adding 1 Day: " + getFormattedDate(cal)); 

Как работает Каландр с 1-м часом, когда 2am перемещается вперед до 3 часов.

Ну, он должен вести себя так же, как если бы вы добавили 1 день к тому же самому Календарю в UTC и преобразовали его обратно, который всегда возвращает 3 утра, как ожидалось, так как 2am действительно стал 3am. Использование календаря на основе GMT ​​за то же время производит:

перед добавлением 1 день кал: 2015-03-07 02:00:00 -0500

перед добавлением 1 день GMT калибровочный: 2015-03 -07 07:00:00 +0000

После добавления 1 день GMT кал: 2015-03-08 07:00:00 +0000

После добавления 1 день кал: 2015-03- 08 03:00:00 -0400

 Calendar gmtCal = Calendar.getInstance(UTC_TIMEZONE); 
     gmtCal.setTimeInMillis(calTime); 
     System.out.println("Before Adding 1 Day cal: " + getFormattedDate(cal)); 
     System.out.println("Before Adding 1 Day GMT cal: " + getFormattedDate(gmtCal)); 
     gmtCal.add(Calendar.DATE, 1); 
     cal.setTimeInMillis(gmtCal.getTimeInMillis()); 
     System.out.println("After Adding 1 Day GMT cal: " + getFormattedDate(gmtCal)); 
     System.out.println("After Adding 1 Day cal : " + getFormattedDate(cal)); 
+2

Пожалуйста, покажите короткую, но полную программу, демонстрирующую проблему, включая настройки для вашего часового пояса. –

+0

Вы добавили код, но вам нужно показать определение для 'getFormattedDate' и' calTime'. Вы также не показали нам «cal». Ваш примерный код должен легко компилироваться и демонстрировать вашу проблему. –

ответ

1

Для тех часовых поясов, реализующих DST, местное время 2015-03-07 02:00:00 -0500 технически не существует. В этих случаях я бы предположил, что результаты не определены. Разумеется, вы можете протестировать 2015-03-07 01:59:59 -0500 и 2015-03-07 03:00:00 -0500, которые должны давать правильные результаты или, по крайней мере, не перекручиваться с помощью перехода на летнее время.

Но потеря часа будет иметь смысл в этом случае, если, например, код внутренне добавляет 86400 секунд.

+0

Ну, он должен вести себя так же, как если бы вы добавили 1 день к тому же самому Календарю в UTC и преобразовали его обратно, который всегда возвращает 3 утра, как ожидалось, так как 2am действительно стал 3am. –