2016-03-09 3 views
0

Весной я загружаю файл csv, где я также разбираю даты. Все, кажется, работает хорошо для одной строки, за исключением, где я получаю за исключениемSpring Batch - не удалось разобрать дату с правильным форматом

Unparseable date: "2014-03-09 02:07:07", format: [yyyy-MM-dd HH:mm:ss]

Я проверил мой входной файл и нет никаких специальных/невидимых символов в этом не удались строкой.

Caused by: java.lang.IllegalArgumentException: Unparseable date: "2014-03-09 02:07:07", format: [yyyy-MM-dd HH:mm:ss] 
    at org.springframework.batch.item.file.transform.DefaultFieldSet.parseDate(DefaultFieldSet.java:778) 
    at org.springframework.batch.item.file.transform.DefaultFieldSet.readDate(DefaultFieldSet.java:595) 

Спасибо за помощь!


EDIT

Когда я изменяю час Дата от к чему-то еще (например, '2014-03-09 : 07: 07'), он работает. Когда я затем меняю его вручную на , он снова не работает. Как это может быть возможным? Изменение других элементов даты не помогает. Только изменение часа.

Я использую это только на нашем сервере unix с часовым поясом America/New_York. С моей локальной машины все работает. Версия JDK на обоих идентична.

+0

Вы также можете опубликовать свой фрагмент кода? – Pranalee

+0

его весенний пакет defaultfieldset я использую. Не много кода, который я могу опубликовать. – Majky

+0

oh .. может быть проблема локали .. вы можете проверить, какой язык использует ее .. – Pranalee

ответ

1

Это было вызвано комбинацией настроек TimeZone, летнего времени и SimpleDateFormat.lenient.

Наш хост linux имеет America/New_York часовой пояс.

Дата, на которую я получаю сообщение об ошибке является 9-MAR-2014 @ 2:07:07 утра , который точную дату и время, когда в NYK время часового пояса сдвигает 1 hour forward - экономия (от 2 часов ночи до 3 утра) дневного света.

Обычно, когда SimpleDateFormat преобразует такую ​​дату, это automatically changes it to 3am. Значение lenient на false (значение по умолчанию для is true) предотвращает это и генерирует исключение - HOUR_OF_DAY: 2 -> 3.

Это исключение расходуется в процессе, и в конце мы получаем только IllegalArgumentException с сообщением Unparseable date: "2014-03-09 02:07:07", format: [yyyy-MM-dd HH:mm:ss].

Здесь я использую весеннюю загрузку DefaultFieldSet, у которой есть реализация, где она специально устанавливает lenient в false.

/* ... some other code ... */ 
private DateFormat dateFormat = new SimpleDateFormat(DEFAULT_DATE_PATTERN); 
{ 
    dateFormat.setLenient(false); 
} 

/* ... some other code ... */ 

@Override 
public Date readDate(int index, String pattern) { 
    SimpleDateFormat sdf = new SimpleDateFormat(pattern); 
    sdf.setLenient(false); 
    return parseDate(readAndTrim(index), sdf); 
} 
/* ... some other code ... */ 

Как мы не делаем никаких манипуляций с датами в нашем коде, я просто установил его с изменением часового пояса по умолчанию UTC.

TimeZone.setDefault(TimeZone.getTimeZone("UTC")); 

Другой действительный подход был бы написать пользовательскую реализацию FieldSet.