Я преобразую два типа строк в формат 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 предоставлена Джимом Гаррисоном. Спасибо Ахмаду и Джиму