事情经过
今天下午在研究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,

本文讲述了在使用Java8的DateTime时遇到的问题,涉及到1582年历法转换,即凯撒历到格里高利历的转变。由于ISO-8601历法不包含这一转换,导致在处理历史日期时可能出现不一致。文章详细分析了原因,并提醒开发者处理历史日期时需要考虑额外的上下文信息。
最低0.47元/天 解锁文章
9409





