Java - SimpleDateFormat意外的解析行为

时间:2015-02-13 17:27:09

标签: java spring date

我正在从一个文件(.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);

我不需要的日期格式在这里显示,过去这个问题从未发生过。最后,信息将被发送到问题仍然存在的数据库。

5 个答案:

答案 0 :(得分:2)

不,它变成" java.util.DateDate.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。希望它会对你有所帮助。