Тестирование парсера даты с часовым поясом в Java
То, что кажется достаточно простой проблемой, вызывает у меня сильную головную боль при разборе даты.
В моем Java-проекте у меня есть собственный класс утилит парсера дат, который обрабатывает все различные варианты форматов строк даты, с которыми он может столкнуться.
Мне недавно пришлось добавить следующий вариант использования:
DateFormat fileDateImport = new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss zzz");<br />
return fileDateImport.parse(stringToParse);
Теперь я хочу протестировать эту функциональность, но у меня были проблемы, потому что дата не переводится так, как я ожидал. Я попробовал несколько вещей, вот как выглядит мой тест (локальные настройки моих компьютеров в CST).
Date returnDate = DateParser.parseDate("Wed, 24 Sep 2014 00:00:00 BST");
final SimpleDateFormat convertedTime = new SimpleDateFormat("ddMMyyyyhhmmss");
convertedTime.setTimeZone(TimeZone.getTimeZone("BST"));
assertEquals("24092014000000", convertedTime.format(returnDate));
Объект returnDate читает "Вторник, 23 сентября, 18:00:00 CDT 2014", чего я и ожидал. CST отстает от BST на 6 часов. Однако я не хочу проверять соответствие toString() этой даты, поскольку этот тест может потенциально выполняться в разных часовых поясах.
Окончательный вывод в формате "24092014050000". Я не уверен, как это происходит, он прыгает вперед на 11 часов от первоначальной даты возврата.
Я попытался установить время возврата в объекте календаря, но я получаю тот же результат.
Кто-нибудь более пригодится с датами, чем у меня есть идеи?
2 ответа
Похоже, вам придется использовать "Европа / Лондон" вместо "BST", если вы имеете в виду британское стандартное время (или "Азия / Дакка", если вы имеете в виду стандартное время Бангладеш).
convertedTime.setTimeZone(TimeZone.getTimeZone("Europe/London"));
См. http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4257424
Если я понимаю ваш вопрос, одно из решений состоит в том, чтобы позвонить setTimeZone()
в вашем convertedTime
DateFormat
и передать его результат getTimeZone()
от твоего fileDateImport
DateFormat
, То есть что-то вроде -
DateFormat fileDateImport =new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
try {
Date d = fileDateImport.parse("Wed, 24 Sep 2014 00:00:00 BST");
final SimpleDateFormat convertedTime =new SimpleDateFormat("ddMMyyyyHHmmss");
convertedTime.setTimeZone(fileDateImport.getTimeZone());
if ("24092014000000".equals(convertedTime.format(d))) {
System.out.println("Passed");
} else {
System.out.println("Failed");
}
} catch (ParseException e) {
e.printStackTrace();
}
Какие выводы Passed
потому что он проходит ваш юнит тест. Основными отличиями являются использование TimeZone от парсера (и использование HH
вместо hh
часами).