Непоследовательное поведение для SimpleDateFormat для часового пояса Амстердам - PullRequest
3 голосов
/ 14 октября 2011

Вчера я столкнулся с проблемой, когда дата рождения человека была изменена после того, как он был упорядочен с помощью XStream с Date на xml, а затем снова распакован на Date.Следующий код воспроизводит странное поведение XStream:

System.setProperty("user.timezone", "Europe/Amsterdam");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S z");
String textIn = "1933-09-17 00:00:00.0 CET";
Date date = dateFormat.parse(textIn);
String textOut = dateFormat.format(date);

System.out.println("input : " + textIn);
System.out.println("date  : " + date);
System.out.println("output: " + textOut);

Результаты:

input : 1933-09-17 00:00:00.0 CET
date  : Sun Sep 17 00:19:32 CEST 1933
output: 1933-09-17 00:19:32.0 CEST

Я обнаружил, что это происходит только для дат до 1940 года. Что определенным образом объяснимоВ Нидерландах в 1940 году произошел переход с так называемого «Амстердамского тиджа» (GMT + 00h19m32s) на европейское время (GMT + 01h00ms).Я не могу объяснить, почему часовой пояс меняется на экономию времени (с CET на CEST).

Если я изменю часовой пояс на Берлин

System.setProperty("user.timezone", "Europe/Berlin");

Я получу ожидаемые результаты:

input : 1933-09-17 00:00:00.0 CET
date  : Sun Sep 17 00:00:00 CET 1933
output: 1933-09-17 00:00:00.0 CET

Мой сервер находится в Амстердаме.Чтобы обойти проблему, я установлю часовой пояс сервера на Берлин.

Мой вопрос: как вы думаете, это ошибка в SimpleDateFormat?Или код недействителен, потому что «1933-09-17 00: 00: 00.0 CET» является недопустимой датой для местоположения Амстердам?

Если это ошибка, следует ли и где об этом сообщать?Если сам по себе ввод даты недопустим, не должен ли метод parse выдать ошибку?

1 Ответ

2 голосов
/ 14 октября 2011

похоже, что Германия не осуществила переход CET к CEST в 1933 году, в то время как Нидерланды сделали:

...