我正在从文件 (.csv) 中读取信息,该文件将在最终用户验证和批准后插入数据库。读取、验证文本文件,并将其信息加载到包含表单的列表中,该列表用于检查数据是否已存在于数据库中。
在解析字符串到日期时出现问题。即使 SimpleDateFormat 的模式为“yyyy-MM-dd”,SimpleDateFormat.parse() 方法也会返回意外的日期格式。
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
将加载的值解析到旅行对象:
travel.setDate( dateFormat.parse( form.getTravelDate() ));
在调试器中,表单将日期显示为:
"2012-12-12"
它是按预期读取的。然而,当解析时变成:
Wed Dec 12 00:00:00 CST 2012
我花了一整天的时间试图解决这个问题,但此时我没有想法。据我所知,该模式没问题,我尝试添加区域设置但无济于事。
编辑:问题是当我需要使用 Hibernate 将值插入数据库时。不需要的格式最终也会显示在数据库中。
数据显示在 .jsp 页面中
HttpServletRequest("table",travelList);
我不需要的日期格式显示在这里,而过去这个问题从未发生过。最后,信息被发送到问题仍然存在的数据库。
最佳答案
不,它“变成”一个java.util.Date
值。如果您随后通过调用 Date.toString()
将其转换回字符串,则应查阅 Date.toString()
文档期待什么。
存储在Date
中的值只是一个时间点——自Unix纪元以来的毫秒数。其中没有格式,没有时区等。它也不知道这只是一个日期值而不是日期和时间(Date
的命名是许多 API 的不幸方面)。
在心理上将“解析操作的结果”与“如果我调用 toString”
时用于表示该结果的字符串值”分开,这一点至关重要。
我还建议您在解析日期时将 SimpleDateFormat
上的时区设置为 UTC - 这样您就知道您可能没有任何模棱两可或跳过的时间导致难以预测的行为。 (当然,您需要知道您已将日期解析为“UTC 日期的开始”并在其他地方适当处理它。)
关于Java - SimpleDateFormat 意外的解析行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28505257/