Добавление дней в часовом поясе Java Восточноевропейское летнее время (EEST) - PullRequest
3 голосов
/ 08 февраля 2012

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

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

Когда я использую часовой пояс, который соблюдает восточноевропейское летнее время (в данном случае я выбрал часовой пояс Африка / Каир), я получаю вывод:

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

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

Любое понимание этого будет оценено.

1 Ответ

3 голосов
/ 08 февраля 2012

Часовой пояс Каира переходит на летнее время в полночь - поэтому час между полуночью 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.

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

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

РЕДАКТИРОВАТЬ: Да, и моя стандартная рекомендация применяется: ditch java.util.Calendar / Date, и идти с Joda Time

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...