Я занимаюсь синтаксической обработкой даты в 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
Такое поведение кажется только происходит с датами, которые попадают в летнее время. Если я вместо этого проанализирую дату, например, декабрь, с моим исходным форматом даты, я получаю правильный результат.
У меня есть ограниченный контроль над форматом дат, которые я обрабатываю, и они могут поступать из разных часовых поясов. Кто-нибудь сталкивался с этим поведением раньше, и есть ли способ обойти его без изменения формата строки даты? Я понимаю, что обозначения часовых поясов являются избыточными, но, насколько я могу судить, они неверны.
Это не нерегулярность, 'SimpleDateFormat' предполагает, что' Date' должен быть возвращен в Locale и TimeZone по умолчанию из 'String', который находится в другом часовом поясе. –
Интересно, что я нахожусь в Восточном дневном свете, и когда я попробовал тот же код и напечатал дату, я получил «Sun Aug 11 13:00:00 EDT 2013». – VGR
Я думаю, что эти две части часового пояса на самом деле не являются избыточными, а скорее конфликтуют друг с другом, и в этом случае я ожидал бы, что SimpleDateFormat проявит непредсказуемое поведение. Распечатайте значения, возвращаемые 'TimeZone.getTimeZone (« GMT-07: 00 »)' и 'TimeZone.getTimeZone (« US/Pacific »)', чтобы понять, почему я подозреваю, что они конфликтуют. – VGR