乐趣区

关于java:Java8-LocalTime-与MySQL-DateTime-精度不同导致保存值错误

Java LocalTime 精度

/**
 * The maximum supported {@code LocalTime}, '23:59:59.999999999'.
 * This is the time just before midnight at the end of the day.
 */
public static final LocalTime MAX;

查看 LocalTime 的办法正文,很分明的写明精度为小数点后 9 位,最大到.999999999。

MySQL DateTime 精度
5.7 之后的版本,在默认的秒精确度上,能够带小数,最多带 6 位小数,即能够准确到 microseconds (6 digits) precision。

Type Range Remark
DATETIME ‘1000-01-01 00:00:00.000000’ to ‘9999-12-31 23:59:59.999999’‘YYYY-MM-DD hh:mm:ss[.fraction]’
TIMESTAMP‘1970-01-01 00:00:01.000000’to‘2038-01-19 03:14:07.999999’‘YYYY-MM-DD hh:mm:ss[.fraction]’
DATETIME 的工夫精度为小数点后 6 为,最大到.999999

查问返回谬误后果
如果应用 LocalTime 作为查问条件代入查问 SQL 中,因为 LocalTime 的精度超出了 DateTime 的精度,这种状况下, 假如查问条件是 between 2021-01-01 00:00:00 and 2021-01-01 23:59:59.999999999(完结工夫是由框架依据 LocalTime.MAX 变量主动转化),查问后果将蕴含 2021-01-02 00:00:00 的数据,这将导致谬误的后果产生,因为 2021-01-02 00:00:00 的数据不是咱们想要的。

解决方案
能够在调用 LocalTime.MAX 时手动指定准确到 6 位:LocalTime.MAX.withNano(999999000);

例如前一个小时的最大工夫:

LocalDateTime.now().with(LocalTime.MAX).withHour(LocalDateTime.now().minusHours(1).getHour()).withNano(9999
————————————————
版权申明:本文为 CSDN 博主「tlojy」的原创文章,遵循 CC 4.0 BY-SA 版权协定,转载请附上原文出处链接及本申明。
原文链接:https://blog.csdn.net/tlojy/a…

退出移动版