несоответствие часового пояса при разборе строк datetime - PullRequest
0 голосов
/ 04 февраля 2011

Я преобразую два типа строк в формат ISO, используя SimpleDateFormat для синтаксического анализа и org.apache.commons.lang.time.DateFormatUtils для форматирования (поскольку они предоставляют готовый форматер ISO).

Строки шаблона для разбора M/d/y H:m и d.M.y H:m. Типичная строка для преобразования может выглядеть как 4/14/2009 11:22 или 4.14.2009 11:22. Я инициализирую парсеры следующим образом:

SimpleDateFormat SLASH = new SimpleDateFormat(PATTERN_S, Locale.getDefault());
SimpleDateFormat DOT = new SimpleDateFormat(PATTERN_D, Locale.getDefault()); 

Я получаю форматер:

  FastDateFormat isoFormatter = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT

После создания Date из проанализированной строки:

Date date = FORMAT_SLASH.parse(old);

форматируется для вывода:

isoFormatter.format(date)

Странная вещь: когда String с косыми чертами был преобразован, выходные данные выглядят как 2009-04-14T11:42:00+01:00 (что правильно), но когда String с точками были преобразованы, выходные данные выглядят как 2010-02-14T11:42:00+02:00, сдвигая мой часовой пояс где-то между Финляндией и Южной Африкой, год до 2010 и месяц до февраля

Что здесь происходит и почему?

EDIT : изменил выходные строки, чтобы они соответствовали реальному результату (черт возьми, вырезать-вставить). Причина заключалась в том, что я поменял M и d в строках паттернов, которые я не заметил. 14 кажется вполне корректным месяцем - его февраль следующего года и даже неброские настройки не могут заставить форматировщик отказаться от него. Проблема временного сдвига решена, и причина изменения TimeZone предоставлена ​​Джимом Гаррисоном. Спасибо Ахмаду и Джиму

1 Ответ

1 голос
/ 04 февраля 2011

Ваш точечный шаблон - d.M.y H:m, в то время как ваш пример показывает, что вы имели в виду M.d.y H:m, я предполагал, что это выкинет ParseException, но это не так и вызывает проблемы с часовым поясом.

...