上一家公司里遇到这么个需求,在明天0点根据操作特定数据,当时没有使用批处理,因为该操作仅仅需要执行这么一次。所以我们考虑了redis来设置一个定时key/value来实现这一操作,然而定时key/value需要设置多久执行,由于是第二天0点,所以使用了以下代码获取距离第二天0点的一个秒数,这里不多做阐述,直接上代码,具体说明见注释或者在评论区讨论。
Calendar cal = Calendar.getInstance();
// 此处有坑,这个DayOfYear的声明并不是今年的第几天,这里我测试出来的是今天之后的第几天,不要强行翻译理解
cal.add(Calendar.DAY_OF_YEAR, 1);
// 一天内的第几个小时
cal.set(Calendar.HOUR_OF_DAY, 0);
// 小时内的多少分钟
cal.set(Calendar.MINUTE, 0);
// 分钟内的多少秒
cal.set(Calendar.SECOND, 0);
// 秒里的多少毫秒
cal.set(Calendar.MILLISECOND, 0);
// 内容打印
System.out.println(cal.getTimeInMillis());
System.out.println(System.currentTimeMillis());
System.out.println(cal.getTimeInMillis() - System.currentTimeMillis());
// 计算
long l = (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
System.out.println(l);
最终得到的这个小写L变量就是距离第二天0点的一个秒数了。不过此处计算的时候是直接毫秒数相减除以1000得到的秒数,如此做法可能会有距离第二天0点毫秒级别的差值,如果不在意即可使用,如果硬性要求必须0点之后才能执行,那么可以在除完之后手动将变量L+1即可保证时间线控制在0点之后±N毫秒时间线内。
如果需要获取离第二天时间多少分钟的话需要在计算结果之后继续计算(除以60)即可。
该文章仅供参考,如有错误或缺漏欢迎各位指点迷津。