来源:陈宏鸿

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;}}

代码来源: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;}

关微信公众号:互联网架构师,在后台回复:2T,可以获取我整理的教程,都是干货。

猜你喜欢

1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结

2、如何才能成为优秀的架构师?

3、从零开始搭建创业公司后台技术栈

4、程序员一般可以从什么平台接私活?

5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6、滴滴业务中台构建实践,首次曝光

7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

8、15张图看懂瞎忙和高效的区别

9、2T架构师学习资料干货分享


http://www.taodudu.cc/news/show-1750023.html

相关文章:

  • 看图说话,FastJson 并没有那么流行!
  • GitLab 内置了 CI/CD 工具,强大啊!!
  • 推荐:Windows平台上三款提高工作效率的免费神器!
  • 怒爬某 Hub 资源就为撸了一个鉴黄平台
  • 被Redis击穿的一次面试经历
  • 彻底搞懂“红黑树”......
  • 我们公司不会用分布式事务!
  • 看看华为 Java 编程的军规...
  • 我的天!你竟然没有在SpringBoot中使用过异步请求和异步调用...
  • Spring Cloud 微服务下的权限解决方案
  • DataGrip 上手体验,真香!
  • 又整理了一批可以拿去做副业的开源项目...
  • 为什么我劝你放弃了Restful API?
  • 因为一条SQL,我差点被祭天......
  • 40+ 张最全 Linux / C / C++ 思维导图,收藏!
  • 权威!盘点 100 个最受欢迎的 Java 库!绝对经典
  • 一起围观下我们CTO写的代码,巧妙使用枚举干掉if-else!
  • 要注意了!这样使用MyBatis框架,被攻击了!
  • 曲线救国:提高github下载速度到2MB/s
  • Spring Boot 2.3.3 正式发布!2.4.0 正式版即将发布!
  • 日志框架选型,Logback 还是 Log4j2?
  • SpringBoot项目优雅的http客户端工具,太香了!
  • 知乎高赞:当update修改数据与原数据相同时会再次执行吗?
  • 写出一手烂代码的 19 条准则!
  • 半吊子架构师,一来就想干掉RabbitMQ
  • DDD 到底什么鬼?
  • 华为Java开发编程军规,谁违反谁走
  • 谷歌开源的代码评审规范,值得借鉴!
  • 掌握了这30道MySQL基础面试题,我成了面霸
  • 太强了!这款轻量级的数据库中间件完美解决了SpringBoot中分库分表问题?

别在网上乱找代码了,找了一段代码突然爆了!!!相关推荐

  1. 假设写一段代码引导PC开机这段代码是 ? Here is a tiny quot;OSquot; :-D

    Hello world -- OS 我找到了华科绍志远博士的相关代码,发现他依据MIT的JOS的boot.S 稍作改动.然后单独剥离出来,能够非常好玩~ 资料下载地址: http://download ...

  2. 表白代码c语言_这段代码怎么啦?居然瞬间引起了所有程序员网友的注意!

    不知从何时开始,被黑了十几年的「理工男」得到了释放,人们开始把视线聚焦在了一个群体上,那就是「程序员」!比如,热播的电视大剧<欢乐颂2>里,「直男处女情结」引起了整个互联网热议,众网友纷纷 ...

  3. html页面显示html代码怎么写,求助这段代码如何转换成正常可看的HTML页面

    .东:版当 分类用g9江公时限5传0限北者出敏词本··-商tB7教5北i4浙电版a文书发排版息司有务0大-京新8播 7侵S2与必版0S0K有出司公1: 所授实出当行制7-作4:超记权7-书名愚权I0由 ...

  4. wordpress友联_一段代码开启WordPress友情链接管理

    自从WordPress哪个版本开始,默认的后台就没有了链接管理器,而某些主题并不支持友情链接的管理,例如我们现在在用的GeneratePress.所以使用友情链接的时候,绕了一点弯路,使用了自定义HT ...

  5. Java之父22年前写的一段代码,你见过吗?

    Java之父高斯林是一位加拿大的计算机天才. 他创造了伟大的编程语言--Java,在TIOBE排行榜上,Java常年排名第一. 现在这位63岁高龄的祖师爷依然战斗在编程最前线,宝刀不老. 1.Java ...

  6. python如何注释一段代码_python如何注释

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我是多行注释1 我是多行注释2 我是多行注释3print(我上面的是多行注释)内 ...

  7. 不要网上乱拷贝代码了!一段网上找的代码突然炸了!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 陈宏鸿 https://www.cnblogs.com/aspwe ...

  8. 求求你!不要在网上乱拷贝代码了!一段网上找的代码突然炸了,项目出现大BUG...

    作者:陈宏鸿 链接:https://www.cnblogs.com/aspwebchh/p/12220673.html 作者是做游戏服务器开发的,碰到一个需求,给符某些要求的玩家的发送道具奖励,奖励的 ...

  9. python安装了包在pycharm上看不到_解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题...

    解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题 问题产生: pycharm→settings→Project interpreter→下载matplotlib包 运行代码,出现以下提 ...

  10. idea 高效找出全部未被使用的代码

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 不得不说 idea 真的很强大,认真花一些时间,好好研究研究 id ...

最新文章

  1. 的主机名_Mac教程——修改mac 下主机名、电脑名、局域网主机名
  2. NYOJ 70 阶乘因式分解(二)
  3. 模糊查询与字符串的操作
  4. python3高级 之 生成器
  5. java代码着色_给java代码着色源码
  6. 又一家公司被吃到上市了,每天卖出490吨辣条
  7. 解决canvas合成图片大小错误、模糊以及跨域的问题
  8. 基于TensorFlow实现自定义层的项目代码
  9. PE系统加载RAID驱动
  10. SDL Trados外部审阅无法正常导入并显示修订的问题
  11. 揭秘Apple Watch心率监测技术
  12. English trip M1 - AC11 I Dreamed a Dream? 我做了一个梦 Teacher:Lamb
  13. 安卓集成facebook_设计和编码集成的Facebook应用程序:理论
  14. C#连接达梦数据库基础功公共类
  15. 给飞机叶片穿戴上3D打印传感器
  16. Idea stash 谨慎点玩
  17. 【水题】跑跑卡丁车系列之游戏下载
  18. Axure 9实现折线图/曲线图
  19. STM8S103的三路PWM波形
  20. PHP做期货,单靠技术分析做期货,可行?

热门文章

  1. 腾讯社招 —— 应用宝后端工程师-电话面试
  2. 通过JS制作一个简易数码时钟
  3. 《程序化广告实战》一 导读
  4. 学习笔记#工作日志使用
  5. 进制之间的转换(转)
  6. XP系统下如何把FAT32转换成NTFS格式的?
  7. Tencent笔试题收集
  8. poj 1958 Strange Towers of Hanoi dp,需要仔细读题
  9. inDesign教程,如何创建具有吸引力的边注栏?
  10. 如何使用 Mac 的通知中心?