在使用Calendar的roll方法时遇到的问题

前提

    最近在使用定时任务接受历史数据,我设置quartz的定时任务是每五分钟通过接口查询数据,然后插入数据库,但是后面通过数据比对发现我大概每100条数据会丢失10条左右,然后我很奇怪,去查看数据库,进行数据比较,发现我每小时都会丢失5分左右的数据,都会在每小时的最后的五分钟没有数据插入;

问题思考

    首先我以为我job的cron表达式错误,然后我的表达式是 "0 */5 * * * ?" ,检查没有问题;

    然后我以为是出现bug了,然后去检查日志文件,发现也没有日志文件产出

    然后我去检查我的代码,因为数据丢失的极为有规律,检查发现,问题源自于我的时间计算,我用的是Calendar的roll方法来计算前五分钟,不是整点的时候计算都没有问题,当是整点的时候,计算就有问题了,于是我敲了个小demo验证

问题发现

//DateUtil是我自己写的时间转换工具类,用来字符串和Date的转换
Date date = DateUtil.formatStringToDate("2019-03-01 11:00:00");
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
//calendar.roll(Calendar.SECOND, -1);//当时间为整点的时候,倒退一秒,输出 2019-03-01 11:00:59
//calendar.roll(Calendar.MINUTE, -1);//当时间为整点的时候,倒退一分钟,输出 2019-03-01 11:59:00
//calendar.roll(Calendar.DAY_OF_MONTH, -1);//当时间为某月第一天的时候,输出2019-03-31 11:00:00
//calendar.roll(Calendar.DAY_OF_YEAR, -1);//当时间为某月第一天的时候,输出2019-02-28 11:00:00
//calendar.roll(Calendar.MONTH, -4);//当时间为3月,回滚4个月,输出2019-11-01 11:00:00



  由上面可知roll是有范围的,他只会在他的范围内变化,不会影响其他范围的变化,比如设置为Calendar.SECOND,他可以在0~59的范围内变化,但是不会影响MINUTE的变化,所以在使用的时候我们得小心使用

问题解决

   不使用roll方法,而使用add方法,问题就解决了
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值