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

boyanx6个月前技术教程18


碰到一个需求,给服某些要求的玩家的发送道具奖励,奖励的数量根据离线的天数计算。

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

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

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;
    }
标签: css禁止复制

相关文章

网页文字禁止复制,一招教你解决

经常在网上查找资料时,看到有用的内容,就会想要复制文字。但是在复制文字的时候,又会遇到许多问题,也就是复制不了文字。看到这种情况,一般人就会付费或者登录进行文字复制,之前大多数人会用冰点文库,冰点软件...

抓狂!DeepSeek复制粘贴到Word 格式全乱套,5招彻底解决!

“明明在DeepSeek里排版得好好的,一复制粘贴到Word里,格式咋就就全乱套了?”你是不是也遇到过这种情况:标题没了加粗,字号全变了;出现了一堆“**”、“###”、“---”等各种符号。列表项缩...

从陌生网页上复制/贴上命令列要小心被黑

安全研究人员警告,HTML页面上的命令列可能藏匿恶意程序码,开发者稍有不察直接复制贴上终端时,可能就让黑客得以于程序中植入后门。复制粘贴要当心,病毒代码在执行一名安全研究人员Gabriel Fried...

有些网站不能复制文字,有什么方法可以强行复制吗?

相信大家都遇到过这样的情况,在网上查找资料,好不容易找到却不能复制,其实这是因为网页中有限制复制的代码~蓝瘦,心碎一地!不要担心,跟着小予快速解决这个小问题,而且还很简单!方法一:打印输出这个方法非常...

17个CSS知识点整理

微信ID:WEB_wysj(点击关注) ◎ ◎ ◎ ◎ ◎◎◎◎◎一┳═┻︻▄(点击页底“阅读原文”下载源代码)● ● ●1、对WEB标准以及W3C的理解与认识标签闭合、标签小写、不乱嵌套、提高搜索机...

学会这5个方法,全网任意免费复制,告别付费复制

我们在网上搜索资料的时候,经常需要把有用的内容复制下来。但是,并不是所有的网站内容都可以复制、粘贴,有时候复制内容会弹出开通VIP,立即解锁文本内容。要么就是提示要付费,才能够复制内容。在这种情况下,...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。