今天看前端本地存储的文章时,看到cookie,就想再加深学习一下cookie。打开MDN找到cookie一节,看到设置expires时,里面提到世界末日,秉承一颗好奇的心,点开了世界末日2038(有兴趣的同学自行百度),一路捋到了“千年虫”问题(有兴趣的同学还是自行百度,本人太懒,不粘贴了)。
对于永久cookie我们用了Fri, 31 Dec 9999 23:59:59 GMT作为过期日。如果你不想使用这个日期,可使用世界末日[Tue, 19 Jan 2038 03:14:07 GMT],它是32位带符号整数能表示从1 January 1970 00:00:00 UTC开始的最大秒长(即01111111111111111111111111111111, 是 new Date(0x7fffffff * 1e3)).
千年虫:大致就是在公元2000年的时候,所有的电子设备都有可能出现瘫痪。这在今天听来大致就是世界末日了,当时也差不多。因为计算机存储器的原因,对于年份只存储了两位数,于是某些程序跨千年时就出现了归零。这bug影响简直巨大啊!除了打开电脑之后的应用程序,信用卡,医学业,航空业……受到影响的行业太多了。查询这个事件的时候,边惊于这个bug的影响力,边感叹于2000年的技术发展!2000年,我还离这个行业差着十几个年头,甚至我都还没有见过大哥大,见过最科技的东西可能就是家里的那台电视和DVD播放机(2000年大概是有了吧,年龄太小不记事)?不知道这算不算初代世纪bug……然后由此联想到了前段时间做过的项目中出现的一个bug!
先说下出bug的那部分需求:
那是一个统计图页面(老套的开场hiahiahia),里面包含十来个echarts统计图,最上面是一个日期搜索,日期段搜索!搜索的需求是按选中的日期段查询统计图数据,初始加载时默认查询当月到前一个月之间的数据,问题就来了。
学前端都知道:
let date = new Date();
let month = date.getMonth();
date; // Wed Feb 24 2021 10:58:19 GMT+0800 (中国标准时间)
month; // 1 上面的日期中显示是 Feb 2月,但是getMonth获取到的是比当前月小1的
month = date.getMonth()+1; // 2 所以一般我们想要获取当前月份,都需要+1
于是,,,在2021年4月,美美的元旦放假3天后,下面这段代码就出问题了,页面报错,统计图加载不出来数据。
let date = new Date();
let endDate = date.getFullYear()+ '-' + (date.getMonth()+1); // 获取截止月份
let startDate = date.getFullYear()+ '-' + date.getMonth(); // 获取起始月份
let str = startDate + ',' + endDate; // 获取字符连接串作为数据传递
乍看大概逻辑是没什么问题的,但是!1月怎么办呢?
传给服务器的截止月份是1月,起始月份变成了0月,2021年0月……棒棒的
立刻上手,修改代码
let date = new Date();
let endMonth = date.getMonth()+1;
let endDate = date.getFullYear()+ '-' + endMonth; // 获取截止月份
let startDate = ''; // 获取起始月份
endMonth==1 ? ( startDate = (date.getFullYear() - 1)+ '-' + 12 )
: ( startDate = date.getFullYear()+ '-' + date.getMonth() );
let str = startDate + ',' + endDate; // 获取字符连接串作为数据传递
涉及到这种日期查询的,加上这个是两个统计图页面。引以为戒!对bug的敏感度不够,这种零零碎碎的点,记得很清楚,但实际上使用的方法上,需要考虑的更周到些。否则如果这种有问题的逻辑大量投入使用时,可能引起的bug就不只是页面报错的问题了。
然后的然后,,,继续看前端存取去liao~