点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试文章

陈宏鸿

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;}
热门内容:数据库连接池到底应该设多大?
项目实践:SpringBoot三招组合拳,手把手教你打出优雅的后端接口
一次SQL查询优化原理分析
start.aliyun.com正式上线
惊呆了,Spring&nbsp;Boot居然这么耗内存!
两小时入门Docker最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・

不要网上乱拷贝代码了!一段网上找的代码突然炸了!相关推荐

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

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

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

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

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

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

  8. 16位代码段与32位代码段的区别

    16位代码段与32位代码段的区别: 16位代码段与32位代码段的区别如下: 16位代码段最长只能为64k,段内偏移量为16位,默认的指令地址及操作地址为16位:  32位代码段最长可以4G,段内偏移量 ...

  9. 特权级——保护模式的特权级检查 DPL,RPL,CPL, 一致代码段,非一致代码段

    特权级是保护模式下一个重要的概念,CPL,RPL和DPL是其中的核心概念,查阅资料无数,总结如下. 一.CPL.RPL.DPL简单解释     CPL是当前进程的权限级别(Current Privil ...

最新文章

  1. 漫谈云计算、虚拟化、容器化--云平台技术栈05
  2. JavaScript MVC之Jamal
  3. 深入解析JNA—模拟C语言结构体
  4. 基础004_V7-DSP Slice
  5. 数字电路与逻辑设计笔记
  6. 查询时拼接两列数据_如何用VBA代码查询两列数据差异?
  7. 在Web.Config中如何引入相对目录下的Access文件
  8. java实现输出下一秒_编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一...
  9. 基于ZYNQ FPGA实现图像采集存储显示
  10. GDI+入门——带你走进Windows图形的世界
  11. C++ 虚函数表详解
  12. [转]C++ 智能指针详解
  13. 设计模式--创建型模式之抽象工厂模式
  14. Alex 的 Hadoop 菜鸟教程: 第4课 Hadoop 安装教程 - HA方式 (2台服务器)
  15. GB2312转换为Unicode编码表
  16. ie java 无法复制粘贴_电脑不能复制粘贴的多种实用解决方法
  17. ES查询结果全局高亮
  18. opengl 库函数 glew glfw glad glut gl glu freeglut
  19. Ubuntu 16.04 VCS+Verdi安装总结
  20. 使用 pip 快速安装 OpenCV

热门文章

  1. 微信小程序实例源码大全demo下载
  2. String,StringBuffer
  3. 手把手,教你怎样用命令行给apk签名
  4. linux系统中删除文件夹
  5. 给GridView增加求和行
  6. F - Count the Colors - zoj 1610(区间覆盖)
  7. (IOS)签名Demo
  8. C#中的委托和事件 (4)---事件和委托的编译代码
  9. Task03:青少年软件编程(Scratch)等级考试模拟卷(一级)
  10. LeetCode实战:螺旋矩阵