То, что кажется довольно простой проблемой, дает мне серьезную головную боль при синтаксическом анализе даты.
В моем проекте 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 - 6 часов по сравнению с BST. Тем не менее, я не хочу проверять toString() этой даты, так как этот тест может потенциально запускаться в разных часовых поясах.
Конечным результатом формата является "24092014050000". Я не уверен, как это получилось в то время, оно ускоряется 11 часов от исходного returnDate.
Я попытался установить время returnDate в календарном объекте, но получаю тот же результат.
Кто-нибудь, более удобный, с датами, чем у меня, есть идеи?
Кажется, вам придется использовать "Европа/Лондон" вместо "BST", если вы имеете в виду британское стандартное время (или "Азия/Дакка", если вы имеете в виду стандартное время Бангладеш).
convertedTime.setTimeZone(TimeZone.getTimeZone("Europe/London"));
См. Http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4257424
Если я понимаю ваш вопрос, одним из решений является вызов setTimeZone()
в вашем convertedTime
DateFormat
и передача результата getTimeZone()
из fileDateImport
DateFormat
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
потому что они проходят ваш unit тест. Основные отличия - использование TimeZone от парсера (и использование HH
вместо hh
течение нескольких часов).
setTimeZone
с нужным часовым поясом BST
. Часовой пояс fileDateInport
является CST
как было указано.
ZonedDateTime
. Тем временем помните, что BST = GMT + 1.