1、现象
MySQL表某个datetime类型,存储2025-03-15 23:59:59,存储成功后,DB表字段值进到第二天的00:00:00,比如2025-03-16 00:00:00。
2、原因
datetime的精确度是毫秒,数据库入库时会有500ms的进位,加上程序给变量赋值的耗时大概率会超500ms。DB的datetime类型,四舍五入,就会存成第二天的00:00:00
3、解决
3.1 实时工具偏移
采用Hutool工具包,方便的进行时间的管理和转换,DateUtil Hutool官网将生成的时间往前偏移999毫秒即可。示例:DateUtil.endOfDay(DateUtil.date()).offset(DateField.MILLISECOND, -999)。
3.2 修改java代码逻辑-设置毫秒级为0
Calendar calendar = Calendar.getInstance();
calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH),23,59,59);
calendar.set(Calendar.MILLISECOND,0);
Date date = calendar.getTime();
3.3 修改DB字段
ALTER TABLE your_table MODIFY COLUMN your_column DATETIME(3);
提高数据存储的精度到毫秒
DATETIME(3) 记录的数据是 2025-03-15 23:59:59:59,精确到毫秒 。
取数据的时候按照需要的格式,格式化下即可。如果是单纯的时间对比 存储的可以直接用 不用处理~