谷歌浏览器下载不了软件时,请右键复制下载地址,到新标签页粘贴访问即可下载;Edge浏览器下载不了时,到下载列表,点击三个点...,再点击保留;或者换其它浏览器

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

作者: 站长SEO 日期: 2021-06-27 10:23:56 人气: - 标签: 不要 网上 拷贝 代码

科技速递:


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

作者:陈宏鸿 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;
    }

网友评论:

喜欢喝咖啡的赫连颢空 :[捂脸]曾经我也会弄最基础的网页代码,后来就全忘完了。。。。。

Diko80458482 :发现我最近有点膨胀了,一个高中没毕业的人竟然也敢点开程序员的文章看了[打脸][打脸]

凉茶泡面888 :原因第一个函数没有对入口数据进行判断,默认第一个数小,装入非法数据就错了

拾柒boy :拷贝完不测试的吗?

Wolnie625 :拷贝代码的时候难道不是先放到一个测试类里面跑跑看再说用不用么[捂脸][捂脸][捂脸]太随意了,太随意了

UENY :游戏突然收到的福利,必须立马转移用掉

用户9090604385147 :想多了吧,还有测试呢。

用户名就改成这样子 :要么JODA库,要么新的JSR310

比特跳动361 :业务逻辑有问题吧,时间差天数不一定刚好整数,为了很严格和精确以及后期更为细粒度的控制,建议通过两时间的毫秒差来处理,这样可以控制到从年到毫秒都可以。你们那一堆代码写的太麻烦!

大山19831109 :垃圾代码。正常的逻辑应该是先算出两个时间对应的时间戳,然后相减,再除以每天的秒数。

叫啥好呢是吧 :[泪奔]我间隔时间长了再看自己写的代码每次都感慨:卧槽看不懂啊!当时我咋那么天才啊?

U211099785 :这个问题拷贝完测试几个时间不就能发现问题了,明明是自己懒!

科技36度半 :问题就出在+365和+366那里,那个判断太暴力了,关键是计算个时间差搞那么奇怪的逻辑,连循环都用上了

60850353 :public static int differentDays(Date date1,Date date2)\n{\n Calendar cal1 = Calendar.getInstance();\n cal1.setTime(date1);\n Calendar cal2 = Calendar.getInstance();\n cal2.setTime(date2);\n int day1= cal1.get(Calendar.DAY_OF_YEAR);\n int day2 = cal2.get(Calendar.DAY_OF_YEAR);\n int year1 = cal1.get(Calendar.YEAR);\n int year2 = cal2.get(Calendar.YEAR);\n if(year1 != year2) //同一年\n{\n int timeDistance = 0 ;\n for(int i = year1 ; i < year2 ; i ++)\n{\n if(i%4==0 && i%100!=0 || i%400==0) //闰年\n{\n timeDistance += 366;\n }\n else //不是闰年\n{\n timeDistance += 365;\n }\n }\n return timeDistance + (day2-day1) ;\n }\n else //不同年\n{\n System.out.println("判断day2 - day1 : " + (day2-day1));\n return day2-day1;\n }\n }

分风野草 :做商业用的代码也会直接复制粘贴,这态度

德玛东亚之力 :为了玩守望先锋自定义我还特意了解过这方面,结果就学起来编程了。。。

HaleyWangCom :试试 java8新 date api

闭着眼睛瞎写 :看year1!= year2分支里,timeDistance += 366或timeDistance += 365就知道这代码不对

建江43 :网上类库还是挺多的,用那种安全的多,至少人家都是测试过的

这是什么梗 :怎么获取上次下线的时间

文章来源:https://www.toutiao.com/group/6817276058526548492/

Copyright © 2009-2021 水淼软件技术 Inc. 保留所有权利。粤ICP备16013086号 粤ICP备16013086号-1 霏凡 转载侵权联系删除