2012-02-07 2 views
3

Я написал приложение Java, в котором я начинаю дату с 1 января 00:00 определенного года. Затем я увеличиваю день 355 раз и распечатываю результаты по пути. Я пытался понять, как временные часы работают с летним временем, и если добавление 1 дня сдвинет время с полуночи до 1 часа при переходе на летнее время. Мой код выглядит следующим образом:Добавление дней в часовом поясе Java Восточноевропейское летнее время (EEST)

TimeZone tz = TimeZone.getDefault(); 
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z"); 
sdf.setTimeZone(tz); 
Calendar cal = Calendar.getInstance(tz); 
cal.set(2008, 0, 1, 0, 0, 0); 
cal.set(Calendar.MILLISECOND, 0); 
for (int i = 0; i < 355; i++) { 
    System.out.println(sdf.format(cal.getTime())); 
    cal.add(Calendar.DAY_OF_MONTH, 1); 
} 

При работе в моем часовом поясе по умолчанию (Восточные США), результат выглядит как я бы ожидать:

01/01/2008 00:00:00 EST 
01/02/2008 00:00:00 EST 
01/03/2008 00:00:00 EST 
01/04/2008 00:00:00 EST 
... 

и когда я перехожу в летнее время, я получить

03/10/2008 00:00:00 EDT 
03/11/2008 00:00:00 EDT 
03/12/2008 00:00:00 EDT 

Когда я использую часовой пояс, отслеживающего Восточной Европы летнее время, (в данном случае, я выбрал часовой пояс Africa/Cairo) Я получаю выход:

01/01/2008 00:00:00 EET 
01/02/2008 00:00:00 EET 
01/03/2008 00:00:00 EET 
01/04/2008 00:00:00 EET 
01/05/2008 00:00:00 EET 

но когда я перейду в восточноевропейской летнее время, я получаю:

04/25/2008 01:00:00 EEST 
04/26/2008 01:00:00 EEST 
04/27/2008 01:00:00 EEST 

И странно, когда EEST заканчивается, я все еще получаю

08/29/2008 01:00:00 EET 
08/30/2008 01:00:00 EET 

Я запутался, почему они timezones ведут себя по-разному, и если это ошибка с часовым поясом Африки/Каира, или если я не понимаю, как работают часы ...

Любое понимание этого состояния d оценить.

+0

какой версии java вы используете? Вы обновили свою базу данных времени JRE с последним? – kosa

+0

Я использую java 6 update 29 ... обновление до 30 сейчас ... –

ответ

3

В Cairo time zone изменения в экономии времени в полночь дневного света - около часа между полуночи 25 апреля 2008 года был пропущен ... настенные часы пошли:

04/24/2008 23:59:58 
04/24/2008 23:59:59 
04/25/2008 01:00:00 
04/25/2008 01:00:01 

Попробуйте добавить один день в то время от 2 утра в восточном часовом поясе США, и вы увидите то же самое - в какой-то момент он дойдет до 03:00.

Непонятно, чего вы пытаетесь достичь точно - я склонен думать, что лучше добавить «количество опытных миллисекунд» к дате/времени в конкретном часовом поясе или добавить «число логический миллисекунд "на локальную дату/время, которая не учитывает часовые пояса. Когда вы конвертируете время от времени в определенной зоне, вам необходимо рассмотреть возможность двусмысленности (одно локальное время, происходящее дважды) или пропуск (одно местное время не происходит вообще).

Для дополнительного удовольствия, в прошлом году Самоа пропущено 30 декабря полностью, в связи с изменением его часового пояса от -14 до +10 ...

EDIT: Да, и моя стандартная рекомендация относится: канавы java.util. Календарь/Дата и перейти с Joda Time

+0

Jon, thanks. Я считаю, что это часть проблемы. Но я ожидаю увидеть подобное поведение при выходе из EEST ... несоответствие кажется неправильным. Но чтобы уточнить, что я пытаюсь сделать, я просто пытаюсь создать набор периодов времени, которые идут с полуночи - полночь каждый день.Я понимаю, что в те дни, когда мы переходим на сберегательное время, что период может составлять 23 или 25 часов (или что полночь может даже не существовать в этот день) –

+0

@JeffStorey: Нет, потому что когда * выезд * EEST, местное время 01 : 00 имеет опыт * дважды *. В принципе, как только вы покинете полночь, вы больше никогда не попадаете в ситуацию, когда местное время не происходит. –

+0

Итак, похоже, что добавление «1 дня» имеет другой эффект в DST против EEST, поскольку EEST происходит в полночь, но DST происходит в 2 часа ночи - это правильно? –

Смежные вопросы