繁体   English   中英

Java-SimpleDateFormat意外的解析行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM