问题现象
数据库:TDSQL(mysql)
数据库驱动:mysql-connector-j:8.2.0
JDK: 1.8
持久层框架:Mybatis
数据库中Date类型字段为’1947-04-15’ ,通过 java.util.Date Java类接收该值得时候报错 IllegalArguementException: Hour Of Day: 0 -> 1
问题原因
- 在1947-04-15做了夏令时调整,将0点调整成了1点,导致那一天没有0点。1947年前后几年也有调整,也有一样的问题,具体哪一天可以写个代码每天跑一下,将String类型的yyyyMMdd转成Date验证一下,不要指定Timezone,也会报错。
- 后面几年的也有夏令时调整,但不是将0点调整到1点,也没有问题。
- 报错原因据查是:在将数据库数据转成Java的Date,如果没有执行Timezone,会在转换是转换的时间在UTC和GMT之间的offset是否一致,如果不一致就会报错。
- 发现Mysql驱动在Date类型的转换中,没有指定Timezone
Date类型走的getTimestamp方法
但是java.sql.Date指定了Timezone
解决方案
- 在MyBatis的mapper文件中,在编辑resultMap字段映射的时候指定该字段Java类型为 java.sql.Date,POJO 类中还是使用 java.util.Date 类接收该值,可正常接收,不会报错,CRUD均正常。
此变更不影响java代码,故本项目使用此方式 - Java中使用LocalDate接收