[英]Java - SimpleDateFormat unexpected parsing behaviour
我正在从文件(.csv)中读取信息,该文件将在最终用户验证和批准后插入数据库。 读取,验证文本文件并将其信息加载到包含表单的列表中,这些表单用于检查数据库中是否已存在数据。
将字符串解析为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);
我不需要的日期格式在这里显示,过去从未发生过此问题。 最后,信息被发送到问题仍然存在的数据库。
不,它“成为” java.util.Date
值。 如果随后通过调用Date.toString()
将其转换回字符串,则应查阅Date.toString()
文档以了解期望的内容。
Date
存储的值只是一个时间点-自Unix时代以来的毫秒数。 那里没有格式,没有时区等。它也不知道这只是一个日期值,而不是日期和时间( Date
的命名是API的许多不幸方面之一)。
至关重要的是,您必须在头脑中将“解析操作的结果”与“如果我调用toString"
用来表示该结果的字符串值”分开。
我还建议您在解析日期时,将SimpleDateFormat
上的时区设置为SimpleDateFormat
这样,您就知道您不可能有任何模棱两可或跳过的时间,从而导致难以预测的行为。 (当然,然后,您需要知道将日期解析为“ UTC日期的开始”,并在其他位置进行适当处理。)
在打印Date
,也需要使用格式化程序。
dateFormat.format( travel.getDate() );
当使用DateFormat
解析String
,您将获得一个完整的Date
对象,该字符串中缺少的时间单位被初始化为零。 在您的示例中,是小时,分钟和秒。
默认情况下,如果不使用格式化程序,则将打印Date
的默认字符串表示形式(由其toString()
方法提供)。
解析并不意味着其格式,它只是将其解析为文本到java.util.Date
对象。 请参阅文档中的parse方法 。
您需要使用format
方法。
dateFormat.format(travel.getDate())
有关更多详细信息,请参见文档 。
如果form.getTravelDate()
返回String,则首先从String 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));
据我了解, parse
方法返回Date
。 下面是解析方法的语法。
public Date parse(String source)
throws ParseException
因此,您需要解析字符串date并将其存储到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
。 希望对您有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.