Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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的日期移动了一天_Java_Mysql_Mybatis_Ibatis - Fatal编程技术网

java到sql的日期移动了一天

java到sql的日期移动了一天,java,mysql,mybatis,ibatis,Java,Mysql,Mybatis,Ibatis,我正在使用MyBatis ORM在Java11应用程序和MySql数据库之间进行交互。当我想将日期对象(java.time.LocalDate和java.sql.date)插入表中(列具有jdbc类型date)时,所有日期向后移动1天 伪示例: Entry entry1=新条目(“John”,LocalDate.of(2019,4,29)) 分录条目2=新分录(“约翰”,日期。价值(“2019-04-29”)) 这两者都将存储在sql表中,如下所示 user |date | --

我正在使用MyBatis ORM在Java11应用程序和MySql数据库之间进行交互。当我想将日期对象(java.time.LocalDate和
java.sql.date
)插入表中(列具有jdbc类型
date
)时,所有日期向后移动1天

伪示例:

Entry entry1=新条目(“John”,LocalDate.of(2019,4,29))
分录条目2=新分录(“约翰”,日期。价值(“2019-04-29”))
这两者都将存储在sql表中,如下所示

user  |date       |
------|-----------|
John  |2019-04-28 |
mysql服务器使用UTC,应用程序可能在不同的时区(GMT+1、GMT+2)上运行,但这不应该始终改变日期,对吗

java类:

公共类条目{
公共字符串用户;
公共本地日期;
}
MyBatis映射器和服务:

import org.apache.ibatis.annotations.Mapper;
导入java.util.List;
@制图员
公共接口UserEntryMapper{
作废保存条目(@Param(“条目”)条目);
}
公共类UserEntryService{
私有最终用户入口映射器用户入口映射器;
@注入
公共UserEntryService(UserEntryMapper dbMapper){
this.userEntryMapper=dbMapper;
}
@交易的
公共作废保存条目(条目){
userEntryMapper.saveEntry(条目);
}
}
MyBatis xml:


插入“用户输入”列表`
(`user`、`date`)
价值观
(#{entry.user},#{entry.date,jdbcType=date});
编辑: 我尝试以不同的方式实例化
java.util.Date

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2019);
cal.set(Calendar.MONTH, Calendar.APRIL);
cal.set(Calendar.DATE, 29);
cal.set(Calendar.HOUR_OF_DAY, 0);
java.util.Date date = cal.getTime();

事实上,这仍然会导致2019-04-28的
。但是,如果我将
cal.set(Calendar.HOUR\u OF_DAY,2)
,则会保存正确的日期。这意味着
java.util.Date
LocalDate
隐式地将时间设置为午夜…:/

尝试将
serverTimezone=GMT%2B1
添加到JDBC连接URL。e、 g

jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B1
更新
实际上,这似乎是一个bug。

尝试将
serverTimezone=GMT%2B1
添加到JDBC连接URL。e、 g

jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B1
更新
实际上,这似乎是一个bug。

简单猜测一下:如果“Date.valueOf”的时间戳基于上午12点的日期,那么到UTC的班次将为-1或-2小时,这将导致一天的休息。您将获得2019-04-29 00:00:00:00,而不是2019-04-28 22:00:00。看,它可能会对您有所帮助。@Enak我怀疑类似的事情。但是
java.sql.Date.valueOf()
采用日期的字符串表示,而不是时间戳。如果在内部将其转换为timestamp@JoakimDanielson,我使用的是mybatis的当前版本,该版本应该包含对这些类的支持(“JSR 310:Date and Time API”的类型处理程序从3.4.5开始就被合并到mybatis核心中)@Damian也许可以试一试。使用
date.valueOf
获取日期,并使用
setHours(inti)
将该值设置为例如上午8点,将其插入表中并检查发生了什么。AFAIK a java.sql.date只是时间戳的包装,因此它仍然可能是一个转换问题。请看一个简单的猜测:如果“Date.valueOf”的时间戳基于上午12点的日期,那么到UTC的班次将为-1或-2小时,这将导致一天的休息。您将获得2019-04-29 00:00:00:00,而不是2019-04-28 22:00:00。看,它可能会对您有所帮助。@Enak我怀疑类似的事情。但是
java.sql.Date.valueOf()
采用日期的字符串表示,而不是时间戳。如果在内部将其转换为timestamp@JoakimDanielson,我使用的是mybatis的当前版本,该版本应该包含对这些类的支持(“JSR 310:Date and Time API”的类型处理程序从3.4.5开始就被合并到mybatis核心中)@Damian也许可以试一试。使用
date.valueOf
获取日期,并使用
setHours(inti)
将该值设置为例如上午8点,将其插入表中并检查发生了什么。AFAIK a java.sql.date只是时间戳的包装,因此它仍然可能是一个转换问题。看见