神奇的【时间】问题

偶现的问题

系统当前有一个会员到期提醒的功能。功能做的比较 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

不知道当时写代码的人还活着不? 活着的话得好好上上课。


如果文章有帮助到您,请点个赞,您的反馈会让我感到文章是有价值的

原文地址:https://www.cnblogs.com/ElEGenT/p/13323191.html