在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版本完全相同。
答案 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]
,它具有专门设置DefaultFieldSet
到lenient
的实现。
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"));
的自定义实现。