这几天做一个每日分享给予奖励的一个需求,用户每天可以分享多次,考虑的不需要入库,将用户的分享次数用redis记录,每天凌晨0点删除key
翻阅了好几篇文章,看到几个坑,分享一下
public Long getSecondsTobeforedawn() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, 1);
// 坑就在这里
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.MILLISECOND, 0);
return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
}
上面这段代码存在一个问题,就是如果当前时间超过中午12:00,则返回的结果是当前时间到第二天中午12:00的秒数;
如果当前时间不超过中午12:00,则返回的结果是到第二天凌晨的秒数
解决方案
public Long getSecondsTobeforedawn() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, 1);
// 改成这样就好了
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.MILLISECOND, 0);
return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
}
本文分享了一个关于使用Calendar类计算距离次日凌晨剩余秒数的常见错误,并提供了正确的解决方案,避免了因使用Calendar.HOUR而非Calendar.HOUR_OF_DAY导致的时间计算偏差。

3066

被折叠的 条评论
为什么被折叠?



