Mysql数据库 23:59:59:999 日期进一问题

问题排查: 目前定位到是数据库版本问题

  1. 版本不一样情况下
    mysql更新到5.6.4 之后 , 新增了factional seconds的特性 , 可以记录时间的毫秒值,超过500就会四舍五入的问题

  2. 版本情况一样下
    version_compile_os = ‘Linux’ 的不存在该问题
    version_compile_os = ‘linux-glibc2.12’ 存在该问题

验证方法

SHOW VARIABLES where Variable_name = 'version_compile_os';

SHOW VARIABLES where Variable_name = 'version';

解决方案:

  1. 重装数据库改变版本
  2. 设置数据库字段的精度为3,保留所有毫秒值,避免进位
  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;
	    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值