问题排查: 目前定位到是数据库版本问题
-
版本不一样情况下
mysql更新到5.6.4 之后 , 新增了factional seconds的特性 , 可以记录时间的毫秒值,超过500就会四舍五入的问题 -
版本情况一样下
version_compile_os = ‘Linux’ 的不存在该问题
version_compile_os = ‘linux-glibc2.12’ 存在该问题
验证方法
SHOW VARIABLES where Variable_name = 'version_compile_os';
SHOW VARIABLES where Variable_name = 'version';
解决方案:
- 重装数据库改变版本
- 设置数据库字段的精度为3,保留所有毫秒值,避免进位
- 程序中做处理
Java中做处理
所有引入的包都是hutool的包
// 获取两个时间差 true代表比较的是24小时制的时间
long day = DateUtil.betweenDay(weekPlanInfo.getBeginTime(), weekPlanInfo.getEndTime(), true);
Date startBeginTime = null;
Date startEndTime = null;
for (int i = 0; i < Convert.toInt(day); i++) {
Date beginTime;
Date endTime;
if (i == 0) {
// 获取日期中的小时数 true表示是24小时制
int hour = DateUtil.hour(weekPlanInfo.getBeginTime(), true);
if (hour >= 20) {
// time是自己写的方法用于 格式化时间
startEndTime = time(weekPlanInfo.getBeginTime(), 23, i, 59, 59);
}
beginTime = weekPlanInfo.getBeginTime();
} else {
beginTime = time(weekPlanInfo.getBeginTime(), 8, i);
}
if (i == Convert.toInt(day) - 1) {
int hour = DateUtil.hour(weekPlanInfo.getEndTime(), true);
if (hour <= 8) {
startBeginTime = DateUtil.beginOfDay(time(weekPlanInfo.getBeginTime(), 0, i));
}
endTime = weekPlanInfo.getEndTime();
} else {
endTime = time(weekPlanInfo.getBeginTime(), 20, i);
}
}
/**
* time方法重载 用于解决Mysql将时间设置为23:59:59:999 时插入数据库会日期加一问题
* @param dateTime 原始时间 年月日
* @param num 小时
* @param i 往后偏移多少天
* @param m 设置的分钟数
* @param s 设置的秒数
* @return 格式化后的时间
*/
public Date time(Date dateTime, int num, int i, int m, int s) {
Date time = DateUtil.offset(dateTime, DateField.DAY_OF_MONTH, i);
// 设置 分秒为00
time.setMinutes(m);
time.setSeconds(s);
time.setHours(num);
return time;
}