Я написал приложение Java, в котором я начинаю дату с 1 января 00:00 определенного года. Затем я увеличиваю день на 355 раз и по ходу дела распечатываю результаты. Я пытался понять, как часовые пояса работают с летним временем, и если добавление 1 дня сместит время с полуночи на 1:00 при переходе на летнее время. Мой код выглядит так:
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
Я не понимаю, почему эти часовые пояса ведут себя по-разному, и если это ошибка часового пояса Африки/Каира, или я неправильно понимаю, как работают часовые пояса...
Любое понимание этого будет оценено.