问题
在使用Hutool的DateUtil.endOfDay
方法时,生成的时间戳为2022-09-23 23:59:59.999
,在写入MySQL数据库后字段值会变为2022-09-24 00:00:00
。
原因
TIMESTAMP
类型字段存储精度默认精确到秒,在存入带有毫秒数据时,毫秒数大于500
时会自动进位。同理,DATETIME
类型默认也是精确到秒的:
UPDATE `test_table` SET `test_time` = '2022-09-23 23:59:59.999' WHERE `id` = 1;
// 2022-09-24 00:00:00
UPDATE `test_table` SET `test_time` = '2022-09-23 23:59:59.499' WHERE `id` = 1;
// 2022-09-23 23:59:59
解决方法
以下两种方法均能解决:
修改字段精度
修改字段为TIMESTAMP(3)
,此时将支持毫秒存储,查询时也会显示毫秒部分。
去除毫秒部分
直接对endOfDay
返回值增加offset
处理。将毫秒部分变为0
后再写入数据库:
DateUtil.endOfDay(date).offset(DateField.MILLISECOND,-999);
或者继承DateUtil
,增加多一个方法使用:
public class DateUtil extends cn.hutool.core.date.DateUtil {
public static DateTime endOfDay(Date date, boolean isOffset) {
if(isOffset) {
return DateUtil.endOfDay(date).offset(DateField.MILLISECOND,-999);
}
return endOfDay(date);
}
}
发表回复