19470415 Hour Of Day: 0 -> 1

问题现象

数据库: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

问题原因

  1. 在1947-04-15做了夏令时调整,将0点调整成了1点,导致那一天没有0点。1947年前后几年也有调整,也有一样的问题,具体哪一天可以写个代码每天跑一下,将String类型的yyyyMMdd转成Date验证一下,不要指定Timezone,也会报错。
  2. 后面几年的也有夏令时调整,但不是将0点调整到1点,也没有问题。
  3. 报错原因据查是:在将数据库数据转成Java的Date,如果没有执行Timezone,会在转换是转换的时间在UTC和GMT之间的offset是否一致,如果不一致就会报错。
  4. 发现Mysql驱动在Date类型的转换中,没有指定Timezone
    Date类型走的getTimestamp方法
    在这里插入图片描述

但是java.sql.Date指定了Timezone

解决方案

  1. 在MyBatis的mapper文件中,在编辑resultMap字段映射的时候指定该字段Java类型为 java.sql.Date,POJO 类中还是使用 java.util.Date 类接收该值,可正常接收,不会报错,CRUD均正常。
    此变更不影响java代码,故本项目使用此方式
  2. Java中使用LocalDate接收
  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值