Java SQL日期关闭1天

时间:2020-05-02 14:47:27

标签: java mysql sql date

我正在使用与我位于同一时区的MySQL服务器。我正在尝试使用以下代码在类型为DATE的列上将java.util.Date插入数据库:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+2")); Date date = dateFormat.parse(map.value("date"));

插入“日期”的位置。问题在于,在数据库中查找时,日期已过了一天。示例:我插入了2020-05-02,数据库显示为2020-05-01。这就产生了一个问题,当我想获取日期为2020-05-02的比赛时,我必须提前1天进行搜索,而这是我不想做的。 同样,这会在一天中的特定时间之间发生,因此我假设它是时区问题,但我不知道如何解决!

提示?

2 个答案:

答案 0 :(得分:4)

此问题来自Java中的MySQL连接器。 8.0.19版使用JVM时区转换日期,这会导致1天休假问题。 8.0.20补丁中已解决此问题。在此处阅读https://dev.mysql.com/doc/relnotes/connector-j/8.0/en/

答案 1 :(得分:3)

对于没有日期,没有时区的仅日期值,定义列时应使用MySQL类型DATE。此类型与SQL标准中定义的DATE类型匹配。

在Java方面,切勿使用java.util.Date。该类是与最早的Java版本捆绑在一起的可怕的日期时间类的一部分。多年前,它们已被JSR 310中定义的 java.time 类所取代。

对于Java中的仅日期值,请使用java.time.LocalDate

在地图中,您应该存储LocalDate对象,而不是仅仅存储字符串。但是,如果必须,您可以解析并生成字符串。字符串的格式似乎与ISO 8601中定义的标准格式一致。默认情况下, java.time 类使用这些标准格式。因此,无需指定格式设置模式。

LocalDate localDate = LocalDate.parse( "2021-01-23" ) ;
可以使用与JDBC driver和更高版本兼容的JDBC 4.2与您的数据库交换 java.time 类的对象。

将其写入数据库。

myPreparedStatement.setObject( … , localDate ) ;

从数据库检索。

LocalDate localDate = myResultSet.getObject( … , LocalDate.class ) ;

使用上面显示的方法使时区变得无关紧要:LocalDate通过JDBC 4.2或更高版本在MySQL类型DATE的列上—也就是说,除非您的JDBC driver是{{3} }(缺陷号30877755):请参见buggy