Java SimpleDateFormat синтаксический анализ нарушений

Я занимаюсь разбором даты на Java и сталкиваюсь с каким-то странным поведением.

У меня есть строка даты, например:

String s = "Sun Aug 11 2013 11:00:00 -0700 (Pacific Daylight Time)"

Я пытаюсь разобрать его в объект даты следующим образом:

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss Z (zzzz)");

Затем я распечатываю результирующий объект даты из sdf.parse(s) и получаю:

Sun Aug 11 12:00:00 CDT 2013

Я нахожусь в центральном часовом поясе, поэтому имеет смысл, что он печатает его как таковой, однако CDT равен -0500, поэтому анализируемая дата должна быть 13:00, а не 12:00.

Странно то, что если я удаляю любую из избыточных частей информации о часовом поясе, дата анализируется правильно. Использование формата "EEE MMM dd yyyy HH:mm:ss Z ('Pacific Daylight Time')" или формата "EEE MMM dd yyyy HH:mm:ss '-0700' (zzzz)" приводит к правильной дате:

Sun Aug 11 13:00:00 CDT 2013

Такое поведение, по-видимому, происходит только с датами, которые попадают в летнее время. Если вместо этого я проанализирую дату, скажем, в декабре, используя исходный формат даты, я получу правильный результат.

У меня несколько ограниченный контроль над форматом дат, которые я анализирую, и они могут поступать из разных часовых поясов. Кто-нибудь сталкивался с таким поведением раньше, и есть ли способ обойти его, не меняя формат строки даты? Я понимаю, что обозначения часовых поясов избыточны, но, насколько я могу судить, они не являются неверными.


person Onite    schedule 05.09.2013    source источник
comment
Это не нарушение правил, SimpleDateFormat предполагает, что Date должен быть возвращен в локали и часовом поясе по умолчанию из String, который находится в другом часовом поясе.   -  person Luiggi Mendoza    schedule 06.09.2013
comment
Интересно, что я живу по восточному летнему времени, и когда я попробовал тот же код и напечатал дату, я получил Sun Aug 11 13:00:00 EDT 2013.   -  person VGR    schedule 06.09.2013
comment
Я думаю, что эти две части часового пояса на самом деле не избыточны, а скорее конфликтуют друг с другом, и в этом случае я ожидаю, что SimpleDateFormat будет демонстрировать непредсказуемое поведение. Распечатайте значения, возвращаемые TimeZone.getTimeZone("GMT-07:00") и TimeZone.getTimeZone("US/Pacific"), чтобы понять, почему я подозреваю, что они конфликтуют.   -  person VGR    schedule 06.09.2013


Ответы (1)


В прошлом, безусловно, были ошибки в обработке Java для перехода на летнее время и часовые пояса, и это, безусловно, похоже на то, что вы нашли. Какая это версия Явы?

Возможно, вы захотите попробовать Joda-Time, чтобы увидеть если он правильно обрабатывает данную дату.

Если Joda не помогает, вам может потребоваться предварительно проанализировать часть этой строки даты, чтобы удалить описательный часовой пояс в скобках, поскольку он работает, когда определен только один. Действительно очень странно!

person laz    schedule 05.09.2013