本文转载自 GitHub爱好者社区

本人是做游戏服务器开发的,碰到一个需求,给符某些要求的玩家的发送道具奖励,奖励的数量根据离线的天数计算。

这个需求实现起来很简单,只需要在玩家上线的时候计算上次离线时间和当前时间间隔的天数,然后根据策划的算法,计算出道具种类与数量,发一封邮件给玩家就可以了。

计算两个时间间隔天数的函数没有现成的,自己又懒得写,就上谷歌搜了下,选了第一条结果,代码如下

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

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

好啦,今天的分享就到这儿啦,我们下次见啦~

求求你!不要在网上乱拷贝代码了相关推荐

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

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

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

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

  3. Git仓库只拷贝代码-不拷贝提交记录-不拷贝其他分支

    1.背景 想拷贝代码到内网开发环境,因为网速很慢,所以希望Git仓库只拷贝代码-不拷贝提交记录-不拷贝其他分支.因为我直接拷贝压缩一个项目居然有1G的内容, 2.重要步骤 复制一个项目,拷贝粘贴 3. ...

  4. 码农:听新来领导说桌面乱的代码也肯定不整洁,我偷偷收拾了工位

    在相当一部分人的眼中,程序员都是不修边幅的,这个观点我并不太认同,只能说部分程序员是这样的,并不能代表全部,还有人认为生活上不爱收拾,工作中就越有能力,这种观点我也不认同,我个人是这么认为的,这中间没 ...

  5. 购物车及商品php代码_php购物车代码_php网上商城购物车代码一例

    摘要 腾兴网为您分享:php网上商城购物车代码一例,有信,英语字典,携程,网赚招聘等软件知识,以及迅雷vip补丁,全能素描,苏酒门户,inshort视频剪辑,北京地铁高清大图,监控上网,云播搜,维融打 ...

  6. Lumen 9.x 对路由限流的正确姿势【别乱抄代码了】

    希望大家找到正确的操作姿势,不要直接网上生搬,其实框架内内置好了一些方法的. 配置中间件 中间件类 首先去 Laravel 拿到中间件源码:ThrottleRequests.php,然后在 app/H ...

  7. asp网上书店的代码_使用Helm将ASP.NET Core应用程序部署到Kubernetes容器集群

    在<容器化单页面应用中RESTful API的访问>以及<容器化单页面应用中Nginx反向代理与Kubernetes部署>两篇文章中,我介绍了一套容器化ASP.NET Core ...

  8. 腾讯 Code Review 规范出炉,你还敢乱写代码?

    前言 作为公司代码委员会 golang 分会的理事,我 review 了很多代码,看了很多别人的 review 评论.发现不少同学 code review 与写出好代码的水平有待提高.在这里,想分享一 ...

  9. 【html】【一个简单的网上购物页面代码】

    先看结果 代码 <!DOCTYPE html> <html><head><title>网上购物</title><meta http-e ...

最新文章

  1. MySQLRPM安装
  2. vCloud Automation Center (vCAC) 6.0 (二)
  3. SPOJ 130 - Rent your airplane and make money(dp+优化)
  4. sql服务器网页无法连接到服务器失败,SQL2008无法连接到服务器,用户’XX’登录失败(错误18456)解决方法...
  5. U-Boot 之二 详解使用 eclipse + J-Link 进行编译及在线调试
  6. 教小学妹学算法:搜索算法解决迷宫问题
  7. python zipfile setpassword_Python模块:zipfile
  8. 使用Docker高效搭建开发环境
  9. 大数据时代 银行信息安全如何防护?
  10. Thinking in Java 4th(Java编程思想第四版)文档、源码、习题答案
  11. gprs模块http mqtt_GPRS模块用TCP实现MQTT协议(基于SIM900A)
  12. Word 统一修改 Mathtype尺寸
  13. spring与spring mvc
  14. cmd查看mysql的ip地址_怎么在cmd中查看数据库ip地?
  15. 虚拟机启动network服务启动失败:ob for network.service failed because the control process exited with error code
  16. JPBC库实现基于身份的签名体制
  17. 硬盘分区表格式GUID和MBR知识普及
  18. SQLite.Interop.dll 没有拷贝到输出目录
  19. 大数据技术背景介绍(开号篇)
  20. C++ 按行读取数据文件,每行以tab分隔

热门文章

  1. FVCOM三维水动力、水交换、溢油物质扩散及输运数值模拟丨FVCOM模型流域、海洋水环境数值模拟方法
  2. biosrecovery什么意思_BIOS是什么意思``
  3. html5 拉窗帘 效果,jQuery和CSS3超酷3D拉窗帘式滚动导航特效
  4. 互联网企业数据应用BI建设全流程解读!
  5. mac迅雷如何批量下载页面全部链接(无需插件,只需三步)
  6. 大数据分析案例-基于决策树算法构建银行客户流失预测模型
  7. android博学谷实验报告,《Android项目实战-博学谷》我的模块
  8. 关于印发《黑龙江省农村土地承包经营权确权登记试点工作操作规程(试行)》的通知
  9. Android百度地图海拔,android studio百度地图SDK获取当前位置和经纬度和海拔
  10. C++描述 5645. 找到最高海拔