偶现的问题
系统当前有一个会员到期提醒的功能。功能做的比较 low, 临近到期 7 天提醒一次,3 天提醒一次。 只在用户那天第一次登录的时候提醒一下。
但是偶尔会有反馈说少一次提醒,要么7天没提醒,要么3天的没提醒。 反馈完,第二天 测试同学 拿到问题去验证又没问题。
客户买会员至少都是年度的。这个操作实现太低频了,所以虽然时有反馈,但一直没关注。
直到这次,客户的 7 天提醒和 3 天提醒都没有。 然后直接把客户的会员给断了 。 客户很怒啊!
问题
客户爸爸很生气, 说确实没收到提醒 。 第二天, 测试同学一上午都复现不出来 。 一头雾水的时候。 吃完饭 , 下午问题出现了。
上午的时候,每次测试都会有提醒,无比正常 。
下午的时候每次测试都没有提醒 , 无比的异常!。 诡异啊!
然后回想问题,好像每次都是客户反馈完,第二天上午去复现问题 , 然后无比的正常。T - T
而恰好 , 客户 7 天及之后的那几天 , 都是在下午才登录 。下午就没有提醒。
代码逻辑
表现显示,应该是时间判断的问题。时间判断的伪代码:
....
long now = System.currentTimeMillis(); //当前时间
long expire = user.getExpire(); // 用户的过期时间的时间戳,是过期那天 23:59:59.999的时间戳
.....
//重点逻辑
//获取 7 天后的最后时间
long nDayAfter = getEndTimeDaysAfter(now,7); // 7 天和 3 天是一样的逻辑
//判断时间
if(expire == nDayAfter){
//去提醒
} else{
//没有提醒
}
........
//获取 N 天后的最后时间
public long getEndTimeDaysAfter(long time, int days) {
Calendar calendar = GregorianCalendar.getInstance();
calendar.setTimeInMillis(time);
calendar.add(Calendar.DATE, days);
calendar.set(Calendar.HOUR, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
return calendar.getTimeInMillis();
}
就这么一块代码逻辑 , 上午就对的,下午就不对!!
眼尖的同学可能已经发现问题了 。 没错, 就是下面这行逻辑的问题:
calendar.set(Calendar.HOUR, 23); // 这个 HOUR 是12小时制的。
上午时间设置 23 ,得到的是 23点这个时间 。
下午时间设置 23 , 得到的是 第二天 的上午 11点的时间。
这个具体可以看: Calendar.HOUR 和 Calendar.HOUR_OF_DAY
不知道当时写代码的人还活着不? 活着的话得好好上上课。
如果文章有帮助到您,请点个赞,您的反馈会让我感到文章是有价值的