Spring Batch - 无法使用正确的格式

时间:2016-03-09 11:02:34

标签: java spring exception spring-batch

在Spring批处理中,我正在加载csv文件,我也在解析日期。 一切似乎工作正常,除了我得到异常的一行

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)

感谢您的帮助!

修改

  

当我将日期从 02 更改为其他内容时(例如'2014-03-09 03 :07:07'),它可以正常工作。当我手动将其更改回 02 时,它再次失败。这怎么可能?更改日期的其他元素无济于事。只改变小时。

     

我只在具有America / New_York时区的unix服务器上遇到此问题。从我的本地机器一切正常。两者的JDK版本完全相同。

1 个答案:

答案 0 :(得分:1)

这是由TimeZone设置,夏令时和SimpleDateFormat.lenient属性组合引起的。

我们的linux主机有America/New_York个时区。

我收到错误的日期是2014年3月9日凌晨2:07:07 这是纽约时区时间变化的确切日期和时间1 hour forward - 夏令时(凌晨2点到凌晨3点)。

通常,当SimpleDateFormat将此日期转换为automatically changes it to 3am时。将lenient属性设置为false(默认值为true)会阻止此操作并抛出异常 - HOUR_OF_DAY: 2 -> 3

此异常在过程中消耗,最后我们只收到IllegalArgumentException消息{。}}。

我在这里使用spring-boot Unparseable date: "2014-03-09 02:07:07", format: [yyyy-MM-dd HH:mm:ss],它具有专门设置DefaultFieldSetlenient的实现。

false

由于我们没有在代码中对日期进行任何操作,因此我只需将默认时区更改为UTC即可修复它。

/* ... 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 ... */

其他有效的方法是编写TimeZone.setDefault(TimeZone.getTimeZone("UTC")); 的自定义实现。