获取使用JDBC未完全指定日期的datetime的年份

时间:2015-08-03 09:14:08

标签: java mysql date datetime jdbc

我有一个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

1 个答案:

答案 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。