DevsDawn
DevsDawn

解决23:59:59.999时间存入MySQL变为00:00:00问题

问题

在使用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);
    }
}
若无特别说明,本文采用 CC BY-SA 4.0 协议进行许可。如需转载,请附上本文链接和本声明。
本文链接:https://devsdawn.com/2022/09/solving-time-accuracy-issues-in-writing-to-mysql/
DigitalOcean云服务,NYSE上市公司,注册即送200USD体验金
Vultr云服务,全球25+地域,注册即送100USD体验金

发表回复

textsms
account_circle
email

DevsDawn

解决23:59:59.999时间存入MySQL变为00:00:00问题
问题 在使用Hutool的DateUtil.endOfDay方法时,生成的时间戳为2022-09-23 23:59:59.999,在写入MySQL数据库后字段值会变为2022-09-24 00:00:00。 原因 TIMESTAMP类型字段存储精度默认…
扫描二维码继续阅读
2022-09-19