事情经过
今天下午在研究mybatis对jsr310的支持, 跟往常一样我准备了一个MySQL测试用的数据表, 里面有些DATETIME列, 默认值是’0000-01-01 00:00:00’, 映射Java类中的create_time等这样的java.time.OffsetDateTime属性.
当我测试的时候我就整个蒙圈了, 某些字段插入我是用OffsetDateTime.now()指定, 这些数据取出来的时候完整无误, 存的时间多少他取出来就是多少, 如2017-03-08T16:14:52+08:00
. 但是当我不设置该值, 选用数据库的默认值的时候, 一返回我就傻了, 0001-01-01T00:05:43+08:05:43
, 这个偏移值真的是闻所未闻… 考虑过Docker MySQL镜像时间的同步问题, 甚至还开始怀疑是不是JDK8有BUG了.
于是乎丫的我就直接开始调试, 直到抓到一条线索, MyBatis从数据库取出至封装至Java Bean的途中, 调用了一个java.sql.Timestamp.from(Instant)
函数, 就是这个函数调用出了问题. 测试之后真的是让我大开眼界.
System.out.println(Timestamp.from(DEFAULT_TIME.toInstant()));
System.out.println(Timestamp.from(OffsetDateTime.of(1582, 10, 14, 23, 59, 59, <