我正在从一个文件(.csv)中读取信息,该文件将在最终用户验证和批准后插入数据库。读取,验证文本文件并将其信息加载到包含用于检查数据是否已存在于数据库中的表单的列表中。
将String解析为Date时出现问题。即使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
我花了一整天时间试图解决这个问题,但此时我已经没有想法了。 Afaik模式没问题,我尝试添加一个区域设置无济于事。
编辑:问题是当我需要使用Hibernate将值插入数据库时。不希望的格式也最终显示在数据库中。
使用
在.jsp页面中显示数据 HttpServletRequest("table",travelList);
我不需要的日期格式在这里显示,过去这个问题从未发生过。最后,信息将被发送到问题仍然存在的数据库。
答案 0 :(得分:2)
不,它变成" java.util.Date
值Date.toString()
。如果您通过调用Date.toString()
将其返回转换为字符串,则应查阅Date
文档以了解预期结果。
Date
中存储的值只是一个时间点 - 自Unix纪元以来的毫秒数。那里没有格式,没有时区等。它也不知道它只是一个日期值而不是日期和时间(toString"
的命名是其中之一< em>很多 API的不幸方面。)
您在心理上分离&#34;解析操作的结果至关重要&#34; from&#34;如果我调用SimpleDateFormat
&#34;,则用于表示该结果的字符串值。
我还建议您在解析日期时将{{1}}上的时区设置为UTC - 这样您知道 可能任何模糊或跳过的时间导致难以预测的行为。 (当然,您需要知道您已经将日期解析为&#34; UTC日期的开始&#34;并在其他地方适当地处理它。)
答案 1 :(得分:0)
在打印Date
时也需要使用格式化程序。
dateFormat.format( travel.getDate() );
使用String
解析DateFormat
时,会得到一个完整的Date
对象,其中字符串中缺少的时间单位已初始化为零。在您的示例中,即小时,分钟和秒。
默认情况下,如果您不使用格式化程序,则会打印Date
的默认字符串表示形式(由其toString()
方法提供)。
答案 2 :(得分:0)
解析并不意味着它的格式,它只是将其解析为java.util.Date
对象的文本。请参阅parse method in documentation。
您需要使用format
方法。
dateFormat.format(travel.getDate())
有关详细信息,请参阅documentation。
答案 3 :(得分:0)
如果form.getTravelDate()
返回字符串,则返回Parse
字符串中的日期
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
Date parsedDate=dateFormat.parse(form.getTravelDate());
// Here parsedDate is in form Wed Dec 12 00:00:00 CST 2012
现在使用相同的SImpleDateFormat格式化日期以获得所需的输出
System.out.println(dateFormat.format(parsedDate));
您想要的输出
2012-12-12
更新
假设我们在数据库中插入此数据的数据类型为Date
类型不是varchar
,请使用以下语句
travel.setDate(dateFormat.format(parsedDate));
答案 4 :(得分:0)
据我所知,parse
方法返回Date
。下面是解析方法语法。
public Date parse(String source)
throws ParseException
因此,您需要解析字符串日期并存储到Date变量中。然后使用SimpleDateFormat
格式化Date变量。
//getTravelDate is "2012-12-12"
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
Date dtObj=new Date();
dtObj=dateFormat.parse(form.getTravelDate()); //Store in date variable
System.out.println(dateFormat.format(dtObj)); // Now format the date object
最终输出为2012-12-12
。希望它会对你有所帮助。