作者:陳宏鴻
來源:www.cnblogs.com/aspwebchh/p/12220673.html
本人是做游戲服務器開發的,碰到一個需求,給符某些要求的玩家的發送道具獎勵,獎勵的數量根據離線的天數計算,
這個需求實作起來很簡單,只需要在玩家上線的時候計算上次離線時間和當前時間間隔的天數,然后根據策劃的演算法,計算出道具種類與數量,發一封郵件給玩家就可以了,
計算兩個時間間隔天數的函式沒有現成的,自己又懶得寫,就上谷歌搜了下,選了第一條結果,代碼如下:
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;
}
}
代碼來源:www.cnblogs.com/0201zcr/p/5000977.html
把代碼復制到專案里,除錯下,發現沒問題就直接用了,畢竟谷歌結果第一名,放心,
這段代碼跑了幾個月一直沒問題,但是到了2020-1-1日那天,有玩家反饋收到了幾百封獎勵郵件,高興壞了,但是出于對游戲的熱愛,還是通知了運營人員,
運營把BUG反饋到服務器這邊后我開始排查,百思不得其解的是最近幾天都沒有更新服務器, 而前幾天服務器都穩穩地,怎么突然就出BUG了呢,
接下來就是分析玩家資料,結合代碼邏輯確定問題所在,最終根據BUG的表現排除了所有可能性后,發現唯一可能出問題的地方就是那個網上復制過來的計算天數差的函式,
根據除錯發現,這個函式在兩個日期引數是不同的年份并且第一個日期大于第二個日期的時候,會回傳一個錯誤的結果
比如:
differentDays("2020-1-1","2019-12-25")
理論上這么呼叫正確的結果是 -7,但是因為函式有BUG,呼叫結果是 358
于是本來不用發獎勵,因為這種特殊情況一下子發出去358份,嚴重影響了游戲某類道具的平衡性,
至于補救方式就是統計名單,把發出去但還沒有用掉的道具回收,用掉的就當福利,然后再發公告道歉,再送些其他物品彌補,
也幸好補救的及時,要是這些道具收不回來,游戲運營的策略都要大變了,我特么肯定沒好果子吃了,
所以千萬別在網上復制來路不明的代碼亂用,如果真的要用,必須反復測驗,否則哪一天突然暴雷有你受的,
改用Java8的日期庫修復了BUG:
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;
}
關注公眾號Java技術堆疊回復"面試"獲取我整理的2020最全面試題及答案,
推薦去我的博客閱讀更多:
1.Java JVM、集合、多執行緒、新特性系列教程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、后端、架構、阿里巴巴等大廠最新面試題
覺得不錯,別忘了點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/117763.html
標籤:Java
上一篇:JVM科普
