Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取日期时间的年份,其中未使用JDBC完全指定日期_Java_Mysql_Date_Datetime_Jdbc - Fatal编程技术网

Java 获取日期时间的年份,其中未使用JDBC完全指定日期

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

我有一个用JDBC连接到MySQL数据库的Java程序,我在其中引入了datetimes。很多时候,只通过将
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