Java 获取日期时间的年份,其中未使用JDBC完全指定日期
我有一个用JDBC连接到MySQL数据库的Java程序,我在其中引入了datetimes。很多时候,只通过将Java 获取日期时间的年份,其中未使用JDBC完全指定日期,java,mysql,date,datetime,jdbc,Java,Mysql,Date,Datetime,Jdbc,我有一个用JDBC连接到MySQL数据库的Java程序,我在其中引入了datetimes。很多时候,只通过将00指定给未指定的日期和月份来引入年份,例如1700年的1700-00-00 当我尝试使用ResultSet.getDate().toString()从结果集获取日期时,我从完全指定的日期中获取正确的日期,但如果是部分日期,则获取:前一年11-30,因此1700年的1699-11-30。当我尝试使用ResultSet.getDate().getTime()时,我得到了相同的结果:-8520
00
指定给未指定的日期和月份来引入年份,例如1700年的1700-00-00
当我尝试使用ResultSet.getDate().toString()
从结果集获取日期时,我从完全指定的日期中获取正确的日期,但如果是部分日期,则获取:前一年11-30,因此1700年的1699-11-30
。当我尝试使用ResultSet.getDate().getTime()
时,我得到了相同的结果:-8520339600000
ResultSet.getTimestamp()
给出了相同的结果
相反,当我使用MySQL查找datetime时,我得到了正确的值1700-00-00
我在不同的年份尝试了相同的结果。任何帮助都将不胜感激
以下是我获取数据的方式(这是一种方法,其他许多方法都类似,并给出相同的结果):
您正在使用的
getDate
方法由供应商提供的JDBCJAR实现(在您的示例中是MySQL)。我相信这些方法在内部使用DateFromat将数据库中的日期转换为导致问题的java.util.Date。在Mysql中,1月表示为1,12月表示为一年中的12个月,因此使用datefromat将其转换为日期,考虑到年份范围1-12。java.util.Date的工作方式不同,它认为0作为十二月和11和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中有一些旧值导致了问题。因此,您需要修改它们或添加一些自定义逻辑,以获取字符串形式的日期,然后将其转换为日期。听起来像是时区问题。表中的
数据执行列到底是什么?如果我对此不够清楚,我会道歉。这是一个datetime
专栏。多亏了你,我现在明白了这个问题。然而,当我尝试以字符串形式获取日期时,我得到了相同的结果:1699-11-30 00:00:00.0
。我找不到一个解决方案,它不能摆脱-00-00
,并在从ResultSet读取时给出正确的值。一个ResultSet.getCharacterStream
方法解决了我的问题。谢谢你让我了解这个问题。
Mon Nov 30 00:00:00 IST 1699
Fri Jan 01 00:00:00 IST 1700
Sat Jan 01 00:00:00 IST 1701