别在网上乱找代码了,找了一段代码突然爆了!!!

简介: 本人是做游戏服务器开发的,碰到一个需求,给符某些要求的玩家的发送道具奖励,奖励的数量根据离线的天数计算。这个需求实现起来很简单,只需要在玩家上线的时候计算上次离线时间和当前时间间隔的天数,然后根据策划的算法,计算出道具种类与数量,发一封邮件给玩家就可以了。

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


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


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

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

代码来源: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;  
}   
相关文章
|
3月前
|
人工智能 小程序 算法
分享64个JavaGame源码总有一个是你想要的
分享64个JavaGame源码总有一个是你想要的
41 0
|
3月前
|
人工智能 Java 关系型数据库
分享66个JavaGame源码总有一个是你想要的
分享66个JavaGame源码总有一个是你想要的
60 0
|
2月前
|
小程序 机器人 Python
分享28个VX小程序源码,总有一款适合您
分享28个VX小程序源码,总有一款适合您
54 1
|
3月前
|
文字识别 NoSQL 物联网
分享55个C源码源代码总有一个是你想要的
分享55个C源码源代码总有一个是你想要的
30 1
|
4月前
|
SQL C# 数据安全/隐私保护
|
10月前
|
数据库
我又写了一堆烂代码
“我又写了一堆烂代码!” 这句话我经常对自己说,目的是为了督促自己不断地思考所写的代码是否足够可靠。
40 0
|
算法 C++
没什么。。。。
没什么。。。。
|
编解码 前端开发 程序员
为啥只跟着视频敲代码学不好编程?
为啥只跟着视频敲代码学不好编程?
303 1
|
SQL 存储 监控
聊聊那些年遇到过的奇葩代码
无论是开发新需求还是维护旧平台,在工作的过程中我们都会接触到各种样式的代码,有时候会碰到一些优秀的代码心中不免肃然起敬,但是更多的时候我们会遇到很多奇葩代码,有的时候骂骂咧咧的吐槽一段奇葩代码后定睛一看作者,居然是几个月以前自己的写的,心中难免浮现曹操的那句名言:不可能,绝对不可能。
聊聊那些年遇到过的奇葩代码
|
前端开发 计算机视觉 Python
代码报错还好说,源码报错才难搞!分享自己源码报错的解决过程!
代码报错还好说,源码报错才难搞!分享自己源码报错的解决过程!
87 0
代码报错还好说,源码报错才难搞!分享自己源码报错的解决过程!