別在網(wǎng)上亂找代碼了,這段代碼突然爆了!!!
這個(gè)需求實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,只需要在玩家上線的時(shí)候計(jì)算上次離線時(shí)間和當(dāng)前時(shí)間間隔的天數(shù),然后根據(jù)策劃的算法,計(jì)算出道具種類與數(shù)量,發(fā)一封郵件給玩家就可以了。
計(jì)算兩個(gè)時(shí)間間隔天數(shù)的函數(shù)沒(méi)有現(xiàn)成的,自己又懶得寫,就上谷歌搜了下,選了第一條結(jié)果,代碼如下:
public static int differentDays(Date date1,Date date2){Calendar cal1 = Calendar.getInstance();cal1.setTime(date1);Calendar cal2 = Calendar.getInstance();cal2.setTime(date2);int day1= cal1.get(Calendar.DAY_OF_YEAR);int day2 = cal2.get(Calendar.DAY_OF_YEAR);int year1 = cal1.get(Calendar.YEAR);int year2 = cal2.get(Calendar.YEAR);if(year1 != year2) //同一年{int timeDistance = 0 ;for(int i = year1 ; i < year2 ; i ++){if(i%4==0 && i%100!=0 || i%400==0) //閏年{timeDistance += 366;}else //不是閏年{timeDistance += 365;}}return timeDistance + (day2-day1) ;}else //不同年{System.out.println("判斷day2 - day1 : " + (day2-day1));return day2-day1;}}
代碼來(lái)源:www.cnblogs.com/0201zcr/p/5000977.html
把代碼復(fù)制到項(xiàng)目里,調(diào)試下,發(fā)現(xiàn)沒(méi)問(wèn)題就直接用了,畢竟谷歌結(jié)果第一名,放心。
這段代碼跑了幾個(gè)月一直沒(méi)問(wèn)題,但是到了2020-1-1日那天,有玩家反饋收到了幾百封獎(jiǎng)勵(lì)郵件,高興壞了,但是出于對(duì)游戲的熱愛(ài),還是通知了運(yùn)營(yíng)人員。
運(yùn)營(yíng)把BUG反饋到服務(wù)器這邊后我開(kāi)始排查,百思不得其解的是最近幾天都沒(méi)有更新服務(wù)器, 而前幾天服務(wù)器都穩(wěn)穩(wěn)地,怎么突然就出BUG了呢。
接下來(lái)就是分析玩家數(shù)據(jù),結(jié)合代碼邏輯確定問(wèn)題所在,最終根據(jù)BUG的表現(xiàn)排除了所有可能性后,發(fā)現(xiàn)唯一可能出問(wèn)題的地方就是那個(gè)網(wǎng)上復(fù)制過(guò)來(lái)的計(jì)算天數(shù)差的函數(shù)。
根據(jù)調(diào)試發(fā)現(xiàn),這個(gè)函數(shù)在兩個(gè)日期參數(shù)是不同的年份并且第一個(gè)日期大于第二個(gè)日期的時(shí)候,會(huì)返回一個(gè)錯(cuò)誤的結(jié)果
比如:
differentDays("2020-1-1","2019-12-25")理論上這么調(diào)用正確的結(jié)果是 -7,但是因?yàn)楹瘮?shù)有BUG,調(diào)用結(jié)果是 358
于是本來(lái)不用發(fā)獎(jiǎng)勵(lì),因?yàn)檫@種特殊情況一下子發(fā)出去358份,嚴(yán)重影響了游戲某類道具的平衡性。
至于補(bǔ)救方式就是統(tǒng)計(jì)名單,把發(fā)出去但還沒(méi)有用掉的道具回收,用掉的就當(dāng)福利,然后再發(fā)公告道歉,再送些其他物品彌補(bǔ)。
也幸好補(bǔ)救的及時(shí),要是這些道具收不回來(lái),游戲運(yùn)營(yíng)的策略都要大變了,我特么肯定沒(méi)好果子吃了。
所以千萬(wàn)別在網(wǎng)上復(fù)制來(lái)路不明的代碼亂用,如果真的要用,必須反復(fù)測(cè)試,否則哪一天突然暴雷有你受的。
public static int differentDays(Date date1, Date date2) {if (date1 == null || date2 == null) {throw new RuntimeException("日期不能為空");}LocalDate localDate1 = date2LocalDate(date1);LocalDate localDate2 = date2LocalDate(date2);return Generic.long2int(localDate1.until(localDate2, ChronoUnit.DAYS));}public static LocalDate date2LocalDate(Date date) {Instant instant = date.toInstant();ZoneId zoneId = ZoneId.systemDefault();LocalDate localDate = instant.atZone(zoneId).toLocalDate();return localDate;}
推薦閱讀:
喜歡我可以給我設(shè)為星標(biāo)哦


