我有一个Java程序连接到带有JDBC的MySQL数据库,我在其中介绍了日期时间。很多时候,只有00
指定未指定的日期和月份,例如{17}年的1700-00-00
,才会引入年份。
当我尝试使用ResultSet.getDate().toString()
从ResultSet获取日期时,我从完全指定的日期得到了正确的日期,但在部分日期的情况下,我得到:previous_year-11-30,所以{{1}对于1700年。当我尝试1699-11-30
时,我得到了相同的结果:ResultSet.getDate().getTime()
。 -8520339600000
会得到相同的结果。
相反,当我使用MySQL查找日期时间时,我得到了正确的值ResultSet.getTimestamp()
。
我尝试过不同年份获得相同的结果。任何帮助将不胜感激。
以下是我获取数据的方法(这是一种方法,其他许多方法类似并给出相同的结果):
1700-00-00
答案 0 :(得分:2)
getDate
方法是由供应商提供的JDBC jar实现的(在您的情况下是MySQL)。我相信这些方法在内部使用DateFromat将日期从数据库转换为导致问题的java.util.Date。在Mysql中jan表示为1和12月表示为一年中的12个月所以使用datefromat将其转换为Date,考虑年份范围1-12.java.util.Date不会以相同的方式工作,它考虑0如同给定的日期或月份大于给定的范围,则以1月和11日为12月,DateFormat和日期以下列月份或日期的方式实施。
例如。如果给定月份为13,那么日期将到明年1月。 01-13-1700将到1701年1月1日。
DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setCalendar(new GregorianCalendar());
Date d=dateFormat.parse("1700-00-00");
System.out.println(d);
d=dateFormat.parse("1700-01-01");
System.out.println(d);
d=dateFormat.parse("1700-13-01");
System.out.println(d);
执行此代码,您将获得更好的理解 的输出: - 强>
Mon Nov 30 00:00:00 IST 1699
Fri Jan 01 00:00:00 IST 1700
Sat Jan 01 00:00:00 IST 1701
问题是您在DB中有一些导致问题的旧值。因此,您需要修改它们或添加一些自定义逻辑以将日期作为String获取,然后将其转换为Date。