Java将字符串解析为日期返回不正确的日期

Posted

技术标签:

【中文标题】Java将字符串解析为日期返回不正确的日期【英文标题】:Java parsing String to a Date returns incorrect Date 【发布时间】:2013-05-31 09:50:47 【问题描述】:

我将我的 2 个 Java 日期类型存储为 mysql 数据库表的日期和时间。我正在使用SimepleDateFormat("YYYY-MM-dd") 将日期存储在我的数据库中,当我选择它时它显示为正确的日期。但是,当我尝试将其解析回 util.Date 并创建一个新的事件对象时,它显示为30/12/2012 而不是31/05/2013,因为它在数据库中。解析为 util.Date 并格式化后的时间会正确打印出来。我不确定为什么 Date 打印了错误的日期,但 time 打印了正确的时间。

数据库

+--------+--------------+-----------+
+ EVENT1 +  2013-05-31  +  02:30:00 +
+--------+--------------+-----------+
+ EVENT2 +  2013-05-31  +  01:00:00 +
+--------+--------------+-----------+

打印:

Event1
30/12/2012
02:30
Event2
30/12/2012
01:00

【问题讨论】:

这可能是由于 DB 和 Java 之间的数据类型不匹配。您在 MySQL 中的列数据类型是什么。如果是日期,则使用 rs.getDate() 代替 rs.getString() .. getDate 返回一个 java.sql.Date,它已经扩展了 java.util.Date 让我回答这个问题...请看我的回答 @Pavan Kumar K,我没有看到你的问题。但我给你的评论投了赞成票。 请看我对这个问题的回答......这应该适合你 【参考方案1】:

它应该是yyyy-MM-dd,带有小写的 Ys。请参阅此处了解大写 Y 的含义...

Y returns 2012 while y returns 2011 in SimpleDateFormat

【讨论】:

这出于某种原因解决了它。我将 dateFormat 更改为 yyyy-MM-dd,它返回了正确的日期 (31/05/2013)。这很奇怪,因为我使用YYYY-MM-dd 将日期插入数据库并将其存储为 31/05/2013 以及.....:\. @user1352609 您不能期望开发语言 (Java) 和您的数据库使用相同的模式。 YYYY 正在使用您的数据库,但与 Java 中的含义不同【参考方案2】:

你的模式是错误的。 (mm != MM, yyyy != YYYY ...)

看看http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

【讨论】:

【参考方案3】:

试试

String testDate = "2007-11-02T14:46:03";
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
Date date = formatter.parse(testDate);

但更好的存储在数据库中的方法是使用时间戳而不是单独存储日期和时间

【讨论】:

【参考方案4】:

正确的方法是rs.getDate(int)。看一眼 http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#getDate(int)

使用该方法,您将获得 java.sql.Date,如果您想将其转换为 java.util.Date,请查看此 Converting java.sql.Date to java.util.Date

你甚至可以这样做

Date date =  rs.getTimestamp(2);

顺便说一句,最好让你的日期对象独立于你想要用来显示它的格式。

【讨论】:

【参考方案5】:

试试这个...

SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd");   
Date date =  dateFormat.parse(rs.getDate(2).toString());

【讨论】:

-1,这没有意义,你已经有一个日期(java.sql.Date,它是java.util.Date的子类)

以上是关于Java将字符串解析为日期返回不正确的日期的主要内容,如果未能解决你的问题,请参考以下文章

使用 SimpleDateFormat 将字符串转换为日期返回不正确的格式 [重复]

Java:解析日期字符串,时区缩写为Date对象

Swift - 将字符串转换为在正确日期前一天返回的日期[重复]

日期格式不正确 java

java.text.ParseException:无法解析的日期:将 mm/dd/yyyy 字符串转换为日期

Dart - 将字符串日期格式化为日期时间