2013-09-05 1 views
1

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

У меня есть строка даты, например следующим образом:

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 

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

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

+0

Это не нерегулярность, 'SimpleDateFormat' предполагает, что' Date' должен быть возвращен в Locale и TimeZone по умолчанию из 'String', который находится в другом часовом поясе. –

+0

Интересно, что я нахожусь в Восточном дневном свете, и когда я попробовал тот же код и напечатал дату, я получил «Sun Aug 11 13:00:00 EDT 2013». – VGR

+0

Я думаю, что эти две части часового пояса на самом деле не являются избыточными, а скорее конфликтуют друг с другом, и в этом случае я ожидал бы, что SimpleDateFormat проявит непредсказуемое поведение. Распечатайте значения, возвращаемые 'TimeZone.getTimeZone (« GMT-07: 00 »)' и 'TimeZone.getTimeZone (« US/Pacific »)', чтобы понять, почему я подозреваю, что они конфликтуют. – VGR

ответ

0

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

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

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