2014-09-29 1 views
1

Кажется, что достаточно простая проблема - это серьезная головная боль при синтаксическом анализе даты.Тег для анализа даты с часовым поясом в 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 читает "Tue Sep 23 18:00:00 CDT 2014", которая является то, что я бы ожидать. CST - 6 часов по сравнению с BST. Тем не менее, я не хочу проверять toString() этой даты, так как этот тест может потенциально запускаться в разных часовых поясах.

Конечный результат в формате «24092014050000». Я не уверен, как это получилось в тот момент, и он продвигается вперед на 11 часов от исходного returnDate.

Я попытался установить время возврата в объект календаря, но получаю тот же результат.

Любое немного более удобно с датами, чем у меня есть идеи?

+0

Если вы можете использовать Java-гораздо лучше Дата модель была введена, обратите внимание на 'ZonedDateTime'. Между тем помните, что BST = GMT + 1. – Caleryn

+0

Это хорошо, но, к сожалению, я не могу контролировать это! Наша текущая версия Java - 7. –

+2

Не немедленное решение, но, вероятно, лучше использовать HH, а не hh. вы можете обнаружить, что это не 5 часов вечера. И попробуйте вывести зоны (Z), чтобы помочь вам разобраться в происходящем. – Caleryn

ответ

2

Кажется, что вам придется использовать «Европа/Лондон» вместо «BST», если вы имеете в виду британское стандартное время (или «Азия/Дакка», если вы имеете в виду стандартное время Бангладеш).

convertedTime.setTimeZone(TimeZone.getTimeZone("Europe/London")); 

См http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4257424

+0

Спасибо Джованни, это сделал трюк! И это объясняет разницу во времени в 11 часов, она, должно быть, использовала стандартное время Бангладеш. –

3

Если я правильно понял ваш вопрос, одно решение назвать 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 в течение нескольких часов).

+0

-1 OP показывает, что он вызывает 'setTimeZone' с требуемым часовым поясом' BST'. Временной зоной 'fileDateInport' является' CST', как было указано. –

+0

@JohnB Кроме того, если вы запустите код выше, он пройдет модульный тест, который OP опубликовал. Обратите внимание, что я использую HH вместо hh в строке формата. Кроме того, * Тем не менее, я не хочу проверять toString() этой даты, так как этот тест может быть потенциально запущен в разных часовых поясах. * –

+0

Я думаю, что вы можете быть правы в том, что я думаю, что проблема может быть ' HH' vs 'hh'. Используя 'hh' и не анализируя' am/pm', невозможно отличить 'am' vs' pm', поэтому результат может быть легко «12 часов».Я просто предлагаю обновить свой ответ, чтобы сосредоточиться на этом, вместо того, чтобы устанавливать «часовой пояс» с помощью OP. –