神奇的【時間】問題

偶現的問題

系統當前有一個會員到期提醒的功能。功能做的比較 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

不知道當時寫代碼的人還活着不? 活着的話得好好上上課。


如果文章有幫助到您,請點個贊,您的反饋會讓我感到文章是有價值的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章