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