作者:陈宏鸿

链接:https://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;}}

代码来源: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.zhihu.com/people/aspwebchh

github:https://github.com/aspwebchh

email:mailto:aspwebchh@gmail.com

     精 彩 文 章 

  • Python的heapq模块源码分析

  • Python进阶:enum模块源码分析

  • 超好看的弦图,Python一行代码就能做

  • seaborn常用的10种数据分析图表

END

来和小伙伴们一起向上生长呀~~~

扫描下方二维码,添加小詹微信,可领取千元大礼包并申请加入 Python学习交流群,群内仅供学术交流,日常互动,如果是想发推文、广告、砍价小程序的敬请绕道!一定记得备注「交流学习」,我会尽快通过好友申请哦!

(添加人数较多,请耐心等待)

(扫码回复 1024  即可领取IT资料包)

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

  1. 求求你!不要在网上乱拷贝代码了

    本文转载自 GitHub爱好者社区 本人是做游戏服务器开发的,碰到一个需求,给符某些要求的玩家的发送道具奖励,奖励的数量根据离线的天数计算. 这个需求实现起来很简单,只需要在玩家上线的时候计算上次离线 ...

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

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

  3. c语言50行以内有趣的代码,分享一段有趣的小代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include //数字雨 typedef struct { int x, y; char ch; }STU; ST ...

  4. c语言 有趣的代码,分享一段有趣的小代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include //数字雨 typedef struct { int x, y; char ch; }STU; ST ...

  5. 短小有趣的c语言代码,分享一段有趣的小代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include //数字雨 typedef struct { int x, y; char ch; }STU; ST ...

  6. c语言有趣代码,分享一段有趣的小代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include //数字雨 typedef struct { int x, y; char ch; }STU; ST ...

  7. java中ssm付款代码_基于Java+SSM的网上订餐系统、基于JavaWeb的网上订餐系统

    需求分析 基于Java+SSM框架实现一个校园点餐系统,包括用户端和管理员端; 前台主要功能有用户注册, 用户登录, 我的购物车.我的订单.商品评论.校园资讯等; 管理员端主要功能有:用户管理.商品管 ...

  8. “熊孩子”乱敲键盘攻破 Linux 桌面;苹果开源代码被发现包含兼容微信的代码;网传蚂蚁启用OKR替代KPI | EA周报...

    EA周报 2021年1月22日 每个星期7分钟,元宝带你喝一杯IT人的浓缩咖啡,了解天下事.掌握IT核心技术. 周报看点 1.Flutter 在鸿蒙系统上成功运行 2."熊孩子"乱 ...

  9. 网络鞋城HTML和css代码,基于jsp的网上鞋城系统-JavaEE实现网上鞋城系统 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的网上鞋城系统, 该项目可用各类java课程设计大作业中, 网上鞋城系统的系统架构分为前后台两部分, 最终实现在线上 ...

最新文章

  1. Exchange 2010 移动邮箱时提示超过了目标配额
  2. 网站文章不收录怎么办!
  3. 在redhat9中交叉编译nano-X nxlib和fltk
  4. 线性代数之行列式基础点
  5. 【微信小程序】组件只读
  6. 爬楼梯(Leetcode)
  7. 【9018题解】2109 卡德加的兔子
  8. FIR设置过采样率 matlab,Xilinx FIR IP的介绍与仿真
  9. 矩阵线性相关则矩阵行列式_搜索线性时间中的排序矩阵
  10. 【转】PF_INET 和 AF_INET 的区别
  11. solr集群搭建,zookeeper集群管理
  12. Archlinux in VirtualBox
  13. 为什么我十分喜欢C,却很不喜欢C++
  14. java get 和post_[Java教程]get和post方法的区别
  15. 第1章 Python 顺序结构
  16. QQ截屏快速获取像素颜色
  17. nodejs php 模板,玩转nodejs
  18. 1000行代码入门python-小白入门篇,Python到底是什么?
  19. Photoshop制作逼真燃烧的文字效果
  20. LiveGBS国标流媒体-摄像头网络直播方案部署问题

热门文章

  1. PHP与Redis结合令牌桶算法进行实现限流
  2. Linux的top命令
  3. python条件表达式连起来写一段话_python学习笔记十三条件表达式应用
  4. php substr的用法,PHP中substr函数如何使用?
  5. PHP5.2至5.6的新增功能详解
  6. python写数据库校验_python 验证 sqlite数据库隔离级别
  7. 离线缓存占内存吗_彻底弄懂浏览器缓存策略
  8. 计算string长度 java_夯实基础:掌握从Java 9+开始的String的空间优化
  9. 使用HTML语言编写HTML教程,HTML教程:HTML编写小经验
  10. python做成绩表_自学Python笔记:用Python做成绩分析(2)