java到sql的日期移动了一天
我正在使用MyBatis ORM在Java11应用程序和MySql数据库之间进行交互。当我想将日期对象(java.time.LocalDate和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 | --
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只是时间戳的包装,因此它仍然可能是一个转换问题。看见