不要网上乱拷贝代码了!一段网上找的代码把公司服务器崩了!
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
碰到一个需求,给服某些要求的玩家的发送道具奖励,奖励的数量根据离线的天数计算。
这个需求实现起来很简单,只需要在玩家上线的时候计算上次离线时间和当前时间间隔的天数,然后根据策划的算法,计算出道具种类与数量,发一封邮件给玩家就可以了。
计算两个时间间隔天数的函数没有现成的,自己又懒得写,就上谷歌搜了下,选了第一条结果,代码如下
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;
}
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-05-22
本文作者:陈宏鸿
本文来自:“互联网架构师 微信公众号”,了解相关信息可以关注“互联网架构师”

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
JEESNS V2.0.0 Beta2 发布,Java 开源 SNS 社区系统
JEESNS是一款基于JAVA企业级平台研发的社交管理系统,依托企业级JAVA的高效、安全、稳定等优势,开创国内JAVA版开源SNS先河,JEESNS可以用来搭建门户、论坛、社区、微博、问答、知识付费平台等。 jeesns_v2.0.0 Beta2版本更新如下: 框架改成SpringBoot2 修订jeesns_v2.0.0 Beta1目前已知bug 应用场景: JEESNS是一个企业级的开源社区系统,是一个可以用来搭建门户、群组、论坛和微博的社区系统。 JEESNS是将SNS社会化网络元素,人和群组结合在一起的新型的社交系统。 JEESNS以人为中心,通过用户的需求和行为将最有价值的信息得以不断整合。 JEESNS是一个稳定、安全、可扩展的社区系统,可以帮您搭建与众不同的交流社区。 如果您要需要搭建一个论坛,那么您可以用JEESNS 如果您需要一个群组,那么您可以用JEESNS 如果您想做一个类似于知乎的知识问答平台,那么您可以用JEESNS 如果您想做一个知识付费平台,那么您可以用JEESNS 如果您需要因为某个话题来汇聚人群,那么您可以用JE...
-
下一篇
无线仍然是 AI 和边缘计算发展的瓶颈
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 数据中心正在向网络边缘扩展,以满足人工智能和其他应用程序的快速响应需求,而这是传统数据中心架构所无法提供的。 传统架构的问题在于它们的集中式框架。通常,数据会从边缘传到数百英里外的电脑上,然后再传回来。当你在使用电子邮件、谷歌、Facebook 和其他通过云提供的应用程序时,这没问题。人脑是台运行缓慢的电脑,无法记录从在浏览器中点击电子邮件到邮件打开之间的时间延迟。 但人工智能和其他新兴应用,如物联网(IoT)、基于云的游戏、虚拟现实等,需要更快的网络响应速度,也就是所谓的“低延迟”。这意味着数据中心的处理过程必须转移到网络边缘。边缘计算可以在小型数据中心中进行,其大小大致相当于海运集装箱,而不是目前支持云计算的仓库大小的大型建筑。 像 EdgeMicro 和 Vapor.io 这样的初创公司正在部署这样的“微型数据中心”。 数据中心运营商仍然可以使用它们的传统结构,并借助快速网络和其他硬件及软件来确保边缘应用程序所需的快速响应时间。边缘数据中心可以位于企业办公场所,也可以位于矿山、船舶...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS关闭SELinux安全模块
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G