一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情。
今天在做一个倒计时抽奖功能需求的时候,在小程序查看没什么问题,真机调试预览也没有问题,倒计时功能都能正常显示,但是当我将代码提交到测试的时候,出现了一个奇怪的问题,原有的倒计时功能没有显示出来。
第一次修改的时候以为是倒计时的时间太近没有正常的判断显示,接着我修改了抽奖开始的时间,然后由于只有体验版的时候出现bug,我就多写了几个console把需要用到的信息打印出来,我分别打印了开始时间,结束时间,还有判断显示的hideclock看看是true还是false,然后再上一版体验版,根据打印出来的信息,发现判断为true,功能被隐藏了,时间判断出现了问题,接着再看一下打印出的开始时间和结束时间,发现结束时间出了问题,并且我是根据时间戳相减是否大于0判断是否到期,相减之后的时间total_micro_second也出现错误,
var NowTime = new Date().getTime();//当前时间
var EndTime = new Date().getTime('2022-04-28 17:55:00')//结束时间
var total_micro_second = EndTime - NowTime || [];//体验版出现问题
that.data.mytimer = setTimeout(function() {//设置定时器
total_micro_second -= 1000;//倒计时每秒递减
that.countdown(that);
}, 1000)
if (total_micro_second <= 0) {
that.setData({
hideClock: true
});
clearInterval(this.data.mytimer)//清除定时器
//return;
}
根据写的代码会发现NowTime应该是正常的不会有什么问题,问题可能出现在EndTime上面,由于我是用getTime传入固定的时间点进行转换时间戳,于是进行面向百度编程
发现new Date(data).getTime()如果传入的时间格式是2020-07-22 12:00:00,就会返回NaN 解决的办法就是通过 new Date(date.replace(/-/g, ‘/’)).getTime(),将横杠转为斜线格式。 于是我将函数该格式进行封装,以免下次用到时间戳在其他功能上仍然会出现错误
function getTimeStampDetail(date) {
if(!date){
return
}
let [dateStr,time] = date.split(" ");
let dt = new Date(dateStr.replace(/\-/g, '/'));
let timeStamp = dt.getTime();
if(time){
let [hour,minute,second] = time.split(":");
var detail = (parseInt(hour)*60*60 + parseInt(minute)*60 + parseInt(second))*1000
}
var timeStampDetail = timeStamp+detail
return timeStampDetail;
}
函数是判断是否传入时间,然后根据传入的时间进行切割,分成年月日和时分秒,然后对年月日进行正则转换,再讲时分秒进行切割转换然后返回,所以我将结束日期改成了以下的格式,utils是我对整个项目的封装,大家可以参考以下,这里就不具体展开了
var EndTime = utils.date.getTimeStampDetail('2022-04-28 17:55:00')
最后打包上测试版,功能就能正常出现了,这个测试还好能及时被发现,测试的手机和笔者的手机都是ios,所以都发现了问题,及时将问题进行解决,顺便说一下以上的bug也是ios会存在的问题