Тестирование парсера даты с часовым поясом в 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() в вашем convertedTimeDateFormat и передать его результат getTimeZone() от твоего fileDateImportDateFormat, То есть что-то вроде -

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 часами).

Другие вопросы по тегам