老板说,我请你来,不是叫你无脑拷贝的,竟然在线上搞出这么大的一个BUG......
本人是做游戏服务器开发的,碰到一个需求,给符某些要求的玩家的发送道具奖励,奖励的数量根据离线的天数计算。
这个需求实现起来很简单,只需要在玩家上线的时候计算上次离线时间和当前时间间隔的天数,然后根据策划的算法,计算出道具种类与数量,发一封邮件给玩家就可以了。
实现计算两个时间间隔天数的函数,没有现成的,我又懒得写,就上谷歌搜了下,选了第一条结果,代码如下
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;}}
代码来源:https://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;}
作者:陈宏鸿
链接:https://www.cnblogs.com/aspwebchh/p/12220673.htm
关注微信公众号:互联网架构师,在后台回复:2T,可以获取我整理的教程,都是干货。
猜你喜欢
1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结
2、如何才能成为优秀的架构师?
3、从零开始搭建创业公司后台技术栈
4、程序员一般可以从什么平台接私活?
5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...
6、滴滴业务中台构建实践,首次曝光
7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事
8、15张图看懂瞎忙和高效的区别
9、2T架构师学习资料干货分享
老板说,我请你来,不是叫你无脑拷贝的,竟然在线上搞出这么大的一个BUG......相关推荐
- 童话:2022趋势研判-请不要不分场合的无脑乐观
相信不用童话陈述,大家都知道最近疫情形势又开始严峻起来.今年能不能过个正常年都还是未知数. 不管怎样,大家早点备好吃的喝的用的,哪怕是虚惊一场,也好过坐以待毙.千万别对岁月静好给迷惑住了,生存历来都是 ...
- 程序员并不适合创业,请不要搞什么 “无脑创业崇拜”
点击上方"码农突围",马上关注 这里是码农充电第一站,回复"666",获取一份专属大礼包 真爱,请设置"星标"或点个"在看&quo ...
- 请接受这份货真价“无”的PPT
UWA技术开放日广州站顺利落下帷幕.原本阴霾的天气让小编特特不安,但是开发者这样的回应令我们整个团队感动笃定: 于是一不小心,我们又办了个高朋满座,宾客满怀: 除了经典的黄金专题 游戏和VR应用性能诊 ...
- 请远离让男人性趣全无的伤精食物
请远离让男人性趣全无的伤精食物 <!-- function content() parse begin--> 导读:美国媒体评出"另类诺贝尔奖",其中可 ...
- HTML5期末大作业:XXX 网站设计——电影请以你的名字呼唤我(4页)HTML+CSS+JavaScript html网页制作期末大作业成品_网页设计期末作业
HTML5期末大作业:XXX 网站设计--电影请以你的名字呼唤我(4页)HTML+CSS+JavaScript html网页制作期末大作业成品_网页设计期末作业 常见网页设计作业题材有 个人. 美食. ...
- 某计算机字长16位,主存容量128KW,请用16K 8 的静态RAM存储芯片和32K 16的ROM芯片,为该机设计一个主存储器。
题目: 某计算机字长16位,主存容量128KW,请用16K 8 的静态RAM存储芯片和32K 16的ROM芯片,为该机设计一个主存储器.要求18000H1FFFFH为ROM区,其余为RAM区.画出存储 ...
- 老板,你请了多少店员帮你赶客?
近几个月研究销售沟通与说服技巧,自然在日常生活中进出各种门店服务场所时,对门店服务人员的服务及销售工作多了很多观察. 本来,老板多聘请几个营业员的目的是为了增加销量,但最后,我发现恰恰就是那些店铺的销 ...
- android+webview+打不开,webview 在android下无法打开 ?是否为一个bug?请帮忙看下!谢谢!...
android 平台上(已经试过 nexus 5 , samsung s6等三个机型),如果先点击右边的图标打开预加载好的webview, 顺利滑出:但是不管之后还是之前,如果打开过左边的webvie ...
- 附件文件无法保存到服务器,可能是目录属性设置问题,请与管理员联系,Discuz不能上传过大文件的解决办法...
烈火网(LieHuo.Net)教程今天论坛附件无法上传,进服务器去查看,后来发展所有DISCUZ论坛都无法上传附件,这个问题很严重,应该说非常之严重,上网找解决方案没有找到,去discuz论坛提问,斑 ...
- DIV布局——电影请以你的名字呼唤我(4页)HTML+CSS+JavaScript html网页制作期末大作业成品_网页设计期末作业
HTML5期末大作业:--电影请以你的名字呼唤我(4页)HTML+CSS+JavaScript html 文章目录 HTML5期末大作业:--电影请以你的名字呼唤我(4页)HTML+CSS+JavaS ...
最新文章
- FPGA(1)基础入门 -- 按键控制led灯
- 对分组交换(packet switching)高效迅速灵活可靠四个优点的理解
- ●Joyoi Dotp 驱逐猪猡
- 美国不要求计算机背景的学校,美国哪些院校计算机专业不需要CS背景
- 网络邻居无法共享解决办法
- .NET Core使用微软AI认知服务识别文字语言
- 第五课 vim基本用法、bash编程初步和for循环
- docker 安装 FastDFS
- undefined与null
- PAT-B wifi密码(非常巧妙)
- mysql binlog hdfs_Mysql binlog 之阿里canal
- 删除html注释 python,用Python提取HTML源码中的注释与去掉注释
- matlab用pathy语言,2018 年度编程语言 -- Python
- 微型计算机控制技术应用,微型计算机控制技术的发展及应用123.doc
- css斜线边框,CSS border斜线效果
- mac虚拟摄像头插件_【OBS虚拟摄像头插件下载】OBS VirtualCam(OBS虚拟摄像头插件) v2.0.5 官方最新版-开心电玩...
- 测试用例之QA有话说
- LoadLibrary加载dll失败的问题
- 小红书一个月快速涨十万粉的秘籍
- 【Python编程入门】环境搭建
热门文章
- 复制字符串 _strdup _wcsdup _mbsdup
- centos7初始化脚本
- js赋值时特殊字符完美处理方案
- WCF Data Services查询
- downie是什么软件?如何在Mac中下载视频?
- Ps提示“脚本错误-50出现一般Photoshop错误,如何解决?
- 如何在 AirPods Pro 上安装 Apple 的 Beta 版固件?
- iOS开发字符串倒序,倒序单词字母,不倒序单词位置
- 3D建模软件:犀牛Rhino 7.16.22067.13002
- MATLAB R2021b for Mac(可视化数学分析软件)