<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          別在網(wǎng)上亂找代碼了,找了一段代碼突然爆了!!!

          共 820字,需瀏覽 2分鐘

           ·

          2020-07-31 17:13

          Java技術(shù)棧

          www.javastack.cn

          關(guān)注閱讀更多優(yōu)質(zhì)文章



          作者:陳宏鴻
          來源:www.cnblogs.com/aspwebchh/p/12220673.html
          本人是做游戲服務(wù)器開發(fā)的,碰到一個需求,給符某些要求的玩家的發(fā)送道具獎勵,獎勵的數(shù)量根據(jù)離線的天數(shù)計算。

          這個需求實現(xiàn)起來很簡單,只需要在玩家上線的時候計算上次離線時間和當(dāng)前時間間隔的天數(shù),然后根據(jù)策劃的算法,計算出道具種類與數(shù)量,發(fā)一封郵件給玩家就可以了。

          計算兩個時間間隔天數(shù)的函數(shù)沒有現(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?????????{
          ????????????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

          把代碼復(fù)制到項目里,調(diào)試下,發(fā)現(xiàn)沒問題就直接用了,畢竟谷歌結(jié)果第一名,放心。

          這段代碼跑了幾個月一直沒問題,但是到了2020-1-1日那天,有玩家反饋收到了幾百封獎勵郵件,高興壞了,但是出于對游戲的熱愛,還是通知了運營人員。

          運營把BUG反饋到服務(wù)器這邊后我開始排查,百思不得其解的是最近幾天都沒有更新服務(wù)器, 而前幾天服務(wù)器都穩(wěn)穩(wěn)地,怎么突然就出BUG了呢。

          接下來就是分析玩家數(shù)據(jù),結(jié)合代碼邏輯確定問題所在,最終根據(jù)BUG的表現(xiàn)排除了所有可能性后,發(fā)現(xiàn)唯一可能出問題的地方就是那個網(wǎng)上復(fù)制過來的計算天數(shù)差的函數(shù)。

          根據(jù)調(diào)試發(fā)現(xiàn),這個函數(shù)在兩個日期參數(shù)是不同的年份并且第一個日期大于第二個日期的時候,會返回一個錯誤的結(jié)果

          比如:

          differentDays("2020-1-1","2019-12-25")

          理論上這么調(diào)用正確的結(jié)果是 -7,但是因為函數(shù)有BUG,調(diào)用結(jié)果是 358

          于是本來不用發(fā)獎勵,因為這種特殊情況一下子發(fā)出去358份,嚴(yán)重影響了游戲某類道具的平衡性。

          至于補救方式就是統(tǒng)計名單,把發(fā)出去但還沒有用掉的道具回收,用掉的就當(dāng)福利,然后再發(fā)公告道歉,再送些其他物品彌補。

          也幸好補救的及時,要是這些道具收不回來,游戲運營的策略都要大變了,我特么肯定沒好果子吃了。

          所以千萬別在網(wǎng)上復(fù)制來路不明的代碼亂用,如果真的要用,必須反復(fù)測試,否則哪一天突然暴雷有你受的。

          改用Java8的日期庫修復(fù)了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;
          }


          最近熱文:

          1、同事寫了個隱藏 bug,我排查了 3 天!

          2、Spring Boot 太狠了,一次發(fā)布 3 個版本!

          3、Spring Boot Redis 實現(xiàn)分布式鎖,真香!

          4、Spring Boot 如何快速集成 Redis?

          5、Java 14 祭出神器,Lombok 被干掉了?

          6、盤點 6 個被淘汰的 Java 技術(shù),曾經(jīng)風(fēng)光過!

          7、Spring Boot 2.3 優(yōu)雅關(guān)閉新姿勢,真香!

          8、Spring Boot 干掉了 Maven 擁抱 Gradle!

          9、公司來了個新同事不會用 Lombok!

          10、Spring Cloud 2020 版本重大變革!

          掃碼關(guān)注Java技術(shù)棧公眾號閱讀更多干貨。

          點擊「閱讀原文」獲取面試題大全~
          瀏覽 33
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  热久久国产精品视频 | 永久在线一区 | 求A片网址 | 欧美成人精品一区二区三区在线观看 | 欧美福利在线观看 |