Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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 SQL日期缩短了1天_Java_Mysql_Sql_Date - Fatal编程技术网

Java SQL日期缩短了1天

Java SQL日期缩短了1天,java,mysql,sql,date,Java,Mysql,Sql,Date,我使用的MySQL服务器与我位于同一时区。我正在尝试使用以下代码将java.util.Date插入数据库中的Date类型的列中: SimpleDataFormat dateFormat=新的SimpleDataFormat(“yyyy-MM-dd”); dateFormat.setTimeZone(TimeZone.getTimeZone(“GMT+2”); Date-Date=dateFormat.parse(map.value(“日期”)) 此处插入“日期”。问题是,在数据库中查找时,日期被

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

SimpleDataFormat dateFormat=新的SimpleDataFormat(“yyyy-MM-dd”);
dateFormat.setTimeZone(TimeZone.getTimeZone(“GMT+2”);
Date-Date=dateFormat.parse(map.value(“日期”))

此处插入“日期”。问题是,在数据库中查找时,日期被取消了一天。示例:我插入2020-05-02,数据库显示2020-05-01。这就产生了一个问题,当我想获得日期为2020-05-02的匹配时,我必须提前1天搜索,这是我不想做的。 这也发生在一天中的特定时间之间,所以我假设这是一个时区问题,但我不知道如何解决它


提示?

对于只包含日期的值,没有时间和时区,在定义列时应该使用MySQL类型
date
。此类型与SQL标准中定义的
DATE
类型匹配

在Java方面,永远不要使用
Java.util.Date
。该类是与最早版本的Java捆绑在一起的糟糕的日期时间类的一部分。多年前,JSR310中定义的java.time类取代了它们

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

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

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

将其写入数据库

myPreparedStatement.setObject( … , localDate ) ;
LocalDate localDate = myResultSet.getObject( … , LocalDate.class ) ;
从数据库中检索

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

使用上面所示的方法使时区变得无关:
LocalDate
通过JDBC 4.2或更高版本在MySQL
DATE
类型的列上-也就是说,除非您的是(Bug#30877755):请参阅。

此问题来自java中的MySQL连接器。版本8.0.19使用JVMs时区转换日期,这会导致1天休假问题。这在8.0.20补丁中得到了解决。请阅读此处

Avoid
java.util.Date
;在内部,它只不过是一个
long
,表示自1970年1月1日UTC午夜以来的毫秒数。在
java.time
包中,它一直被
LocalDateTime
取代。当我需要在数据库中插入now时,我会使用
now()
它可能无法解决您的问题,我建议您不要使用
SimpleDataFormat
Date
。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。相反,只需使用
LocalDate
from。你是对的,这确实是一个时区问题。你的列的数据类型到底是什么?我照你说的做了,但它仍然显示在数据库中的前一天。当我将日期传递到数据库并将其返回到应用程序时,它会显示正确的日期。如果有必要的话,我将使用activejdbc处理数据库事务。我可以在我的代码中添加一天来补偿这一点,但我觉得这是不可行的…我现在通过添加一天插入和一天获取来修复它。看起来至少现在可以用了。@TehSwish我再问一次:你的列的数据类型到底是什么?类型是DATEGood,很好地展示了JDBC驱动程序中修复的错误。经过修正,我在中展示的方法应该可以避免进一步的时区问题影响你的约会。