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

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

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

 

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

 

posted @ 2020-01-21 09:33 陈宏鸿 阅读(4301) 评论(20) 推荐(3) 编辑
摘要: 凌晨两点,我正在睡梦之中,此时电话忽然想起,在漆黑的深夜中显得格外刺耳。 这个时间点电话响了肯定没好事,因为我的手机在夜间模式下,除非被同一个电话号码打三次,否则是静音,因此电话那边的人肯定有急事找我。我心一下子紧绷,睡意全无。 来电的是一个陌生的号码 “喂”我接通电话 “是xxx吗”电话那头是一个 阅读全文
posted @ 2019-12-09 09:14 陈宏鸿 阅读(661) 评论(2) 推荐(1) 编辑
摘要: 一 互联网公司程序员,前些天项目赶进度,被强制加班。 我们公司以前也是鼓励员工加班,但比较隐晦, 不是强制的,而这次是上司直接发话,必须要加班,否则工作无法完成的责任会扣到你头上。 被要求强行加班,无偿的,而且是丧心病狂的996,我脸上显得很平静,但是内心一万头草泥马在奔腾。当天晚上,我就发微信给上 阅读全文
posted @ 2019-11-14 08:13 陈宏鸿 阅读(10362) 评论(119) 推荐(87) 编辑
摘要: 发生一档子事情,公司技术团队之中有两个部门,一个开发一个运维,开发负责公司项目软件项目实现,运维负责项目运行生产环境服务器与数据的管理与维护。 前两天生产环境发生一起故障,项目依赖的redis服务器由于内存不足而出现写入故障,有一批用户丢失了一小时的数据, 公司发出批评通告, 运维全责,运维部门涉事 阅读全文
posted @ 2019-01-18 10:58 陈宏鸿 阅读(6137) 评论(32) 推荐(10) 编辑
摘要: 概述 在开篇之前,先附上日历的代码地址和演示地址,代码是本文要分析的代码,演示效果是本文要实现的效果 代码地址: "https://github.com/aspwebchh/javascript control/tree/master/calendar" 演示地址: "https://www.chh 阅读全文
posted @ 2018-10-11 10:31 陈宏鸿 阅读(7252) 评论(1) 推荐(3) 编辑
摘要: 面向对象程序设计是软件开发中一个很庞大很复杂的话题,它并不是仅仅学会类、继承、封装、多态这些面向对象编程语法元素就表示掌握的,这些语法元素只是实现面向对象程序的工具, 就像砖块、水泥能搭建小屋,也能造高楼大厦,然而在这里重要的不是砖块水泥,而是其它因素。所以,利用面向对象技术写程序,语法元素不是关键 阅读全文
posted @ 2018-05-07 09:06 陈宏鸿 阅读(498) 评论(1) 推荐(1) 编辑
摘要: 技术是程序员安身立命的根本,可一味的追求提高技术却未必能从技术上获得相应的回报。 通常情况下, 程序员要使自己所学的技术产生相应的价值或者收入必须依托于某个公司, 靠自己单干很难赚到钱, 即使能赚到钱性价比也不如替企业打工来的高。 所以程序员一般都是替别人打工的。 程序员在企业里打工,目的就是替公司 阅读全文
posted @ 2018-04-23 14:43 陈宏鸿 阅读(5852) 评论(47) 推荐(51) 编辑
摘要: MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性、可移植性,代码的可重用性。 MVC即Model、View、Controller即模型、视图、控制器。我在和同行讨论技术 阅读全文
posted @ 2018-04-16 08:59 陈宏鸿 阅读(6119) 评论(13) 推荐(6) 编辑
摘要: 有一套web系统,会部署到不同的服务器上分别运行,这套系统类似于市面上的OA系统一样, OA开发商会给不同的企业客户部署一套独立的互不关联的系统,我维护的这套系统也差不多,分别被部署在互不关联的服务器上,当然,这些系统的代码是同一套,功能也都是相同的。 前两天,有客户反馈,他们系统的某个功能无法正常 阅读全文
posted @ 2018-04-12 14:42 陈宏鸿 阅读(912) 评论(4) 推荐(1) 编辑
摘要: 记得以前接手过一个Java项目,服务器程序,直接让Jar在linux上跑的那种, 这个项目由两个web服务组成,也就是两条Java进程,主进程 xxx.jar,辅助进程 xxx_helper.jar。主进程程序中某些功能依赖于辅助进程提供的服务。 困扰我们的BUG是在生产环境中辅助进程xxx_hel 阅读全文
posted @ 2018-04-03 09:30 陈宏鸿 阅读(8116) 评论(32) 推荐(20) 编辑
点击右上角即可分享
微信分享提示