偶現的問題
系統當前有一個會員到期提醒的功能。功能做的比較 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
不知道當時寫代碼的人還活着不? 活着的話得好好上上課。
如果文章有幫助到您,請點個贊,您的反饋會讓我感到文章是有價值的