成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一段網(wǎng)上找的代碼突然爆了,項(xiàng)目出現(xiàn)大Bug!

開(kāi)發(fā) 游戲開(kāi)發(fā) 數(shù)據(jù)庫(kù)
千萬(wàn)別在網(wǎng)上復(fù)制來(lái)路不明的代碼亂用,如果真的要用,必須反復(fù)測(cè)試,否則哪一天突然暴雷有你受的。

本人是做游戲服務(wù)器開(kāi)發(fā)的,碰到一個(gè)需求,給符合某些要求的玩家發(fā)送道具獎(jiǎng)勵(lì),獎(jiǎng)勵(lì)的數(shù)量根據(jù)離線(xiàn)的天數(shù)計(jì)算。 

[[314176]] 

圖片來(lái)自 Pexels

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

計(jì)算兩個(gè)時(shí)間間隔天數(shù)的函數(shù)沒(méi)有現(xiàn)成的,自己又懶得寫(xiě),就上谷歌搜了下,選了第一條結(jié)果,代碼如下:

  1. public static int differentDays(Date date1,Date date2) 
  2.     { 
  3.         Calendar cal1 = Calendar.getInstance(); 
  4.         cal1.setTime(date1); 
  5.  
  6.         Calendar cal2 = Calendar.getInstance(); 
  7.         cal2.setTime(date2); 
  8.        int day1= cal1.get(Calendar.DAY_OF_YEAR); 
  9.         int day2 = cal2.get(Calendar.DAY_OF_YEAR); 
  10.  
  11.         int year1 = cal1.get(Calendar.YEAR); 
  12.         int year2 = cal2.get(Calendar.YEAR); 
  13.         if(year1 != year2)   //同一年 
  14.         { 
  15.             int timeDistance = 0 ; 
  16.             for(int i = year1 ; i < year2 ; i ++) 
  17.             { 
  18.                 if(i%4==0 && i%100!=0 || i%400==0)    //閏年             
  19.                 { 
  20.                     timeDistance += 366; 
  21.                 } 
  22.                 else    //不是閏年 
  23.                 { 
  24.                     timeDistance += 365; 
  25.                 } 
  26.             } 
  27.  
  28.             return timeDistance + (day2-day1) ; 
  29.         } 
  30.         else    //不同年 
  31.         { 
  32.             System.out.println("判斷day2 - day1 : " + (day2-day1)); 
  33.             return day2-day1; 
  34.         } 
  35.     } 

代碼來(lái)源:https://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é)果,比如: 

  1. 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)重影響了游戲某類(lèi)道具的平衡性。

最后,我改用 Java8 的日期庫(kù)修復(fù)了 Bug,代碼如下:

  1. public static int differentDays(Date date1, Date date2) { 
  2.         if (date1 == null || date2 == null) { 
  3.             throw new RuntimeException("日期不能為空"); 
  4.         } 
  5.         LocalDate localDate1 = date2LocalDate(date1); 
  6.         LocalDate localDate2 = date2LocalDate(date2); 
  7.         return Generic.long2int(localDate1.until(localDate2, ChronoUnit.DAYS)); 
  8.     } 
  9.  
  10.     public static LocalDate date2LocalDate(Date date) { 
  11.         Instant instant = date.toInstant(); 
  12.         ZoneId zoneId = ZoneId.systemDefault(); 
  13.         LocalDate localDate = instant.atZone(zoneId).toLocalDate(); 
  14.         return localDate; 
  15.     } 

至于補(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è)試,否則哪一天突然暴雷有你受的。

 

 

責(zé)任編輯:武曉燕 來(lái)源: 博客園
相關(guān)推薦

2022-06-21 12:27:12

JavaScript前端

2020-12-31 10:14:42

防注入代碼繞過(guò)

2020-11-24 06:17:57

微信代碼移動(dòng)應(yīng)用

2019-12-06 10:00:58

代碼開(kāi)發(fā)Java

2021-07-26 23:39:20

Java變量代碼

2018-06-19 08:02:00

統(tǒng)計(jì)程序微信

2014-07-08 09:21:10

死代碼創(chuàng)意歌曲

2018-11-02 16:16:41

程序硬盤(pán)存儲(chǔ)

2021-02-04 07:55:28

代碼離職互聯(lián)網(wǎng)

2021-04-29 23:45:07

函數(shù)式接口可用性

2021-03-09 09:06:33

PythonBug漏洞

2020-07-14 13:31:07

程序員代碼Java

2018-06-23 08:02:31

程序員代碼故事

2015-03-27 11:34:59

JavaJava編寫(xiě)引發(fā)內(nèi)存泄露

2022-12-05 15:03:01

2021-10-28 19:35:02

代碼main方法

2020-04-03 10:14:57

內(nèi)存蠕蟲(chóng)代碼web安全

2023-07-19 17:27:38

研究方案

2020-12-16 07:42:03

JS基礎(chǔ)代碼

2020-10-26 10:11:45

Jupyter Not早起Python開(kāi)發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 免费在线日韩 | 日批的视频 | 在线日韩av电影 | 中文字幕精品视频在线观看 | 精品久久久久一区 | 亚洲午夜精品 | 人人干人人干人人 | 欧美一区二区三区免费电影 | 成人亚洲片 | 亚洲免费在线 | 欧美福利视频一区 | 国产日本精品视频 | 久久在线免费 | 中文字幕久久精品 | 欧美久久久网站 | 欧美精品一区在线观看 | ww亚洲ww亚在线观看 | 久久国产精品99久久久大便 | 久久久久久久综合 | 福利成人 | h视频免费在线观看 | av中文字幕在线 | 一区二区三区视频在线观看 | 91天堂网| 亚洲免费大片 | 久久免费国产视频 | 国产欧美日韩在线一区 | 天堂中文在线观看 | 97精品视频在线 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 91一区二区 | 精品国产乱码久久久久久丨区2区 | 在线观看国产wwwa级羞羞视频 | 中文字幕不卡在线观看 | 精品亚洲一区二区 | 久久精品二区亚洲w码 | 国产亚洲欧美日韩精品一区二区三区 | 欧美久久一区二区 | 国产精品久久久久久久久图文区 | 成人免费视频观看视频 | 午夜精品一区二区三区在线 |