最近接到一个需求,编辑发表文章,时间超过24小时,展示2020-04-05,24小时之内的展示:xxxx小时之前,1个小时之内的展示xxxxx分钟前,24小时之内发布的,字体都要使用红色。
思路是:1、获取到开始时间和结束时间,准确的来讲是获取到新闻发布的时间,并将它设为开始时间,然后再获取到当前时间的时间节点并设置为结束时间,最后利用结束时间 - 开始时间的差值作为一个既定的值,用来做对比。
实现效果:

结构:

逻辑:
// 判断时间间隔 function time_text(){ var time_text = $(".infor").find("span:last-child"); var eleArr = Array.from(time_text); for( var i = 0; i < eleArr.length; i++ ){ var eleText = eleArr[i].innerText; time(eleText, eleArr[i]) } }; time_text(); function time(DateStr,ele){ var startTime = new Date( DateStr ), endTime = new Date(), year = startTime.getFullYear(), month = startTime.getMonth() + 1, date = startTime.getDate(); // startTime.setHours(16) //设置分钟, Time_ = endTime.getTime() - startTime.getTime(); //时间间隔 var leave = Time_ % (24 * 3600 * 1000), house = Math.floor(leave / (3600 * 1000)), //相差小时数 minutes = Math.floor(leave / (60 * 1000)); //相差分钟数 if (Time_ > 24 * 3600 * 1000) { ele.innerText = year + '-' + month + '-' + date; } else if (Time_ <= 3600 * 1000) { ele.innerText = minutes + '分钟之前'; ele.style.color = 'red'; } else { ele.innerText = house + '小时之前'; ele.style.color = 'red'; }; };说明:
变量 time_text 获取到的是 span 标签元素,也就是html元素,需要将它转化成一个数组,我用了 Array.from( time_text ) 将html元素对象转成数组,然后使用for循环去遍历eleArr数组,在循环体内获取到遍历出每个span元素的内容,然后将它传入到封装好的time()函数中,通过时间差值对比每天、每小时、每分钟的毫秒数,最后再改变span标签里的内容。
以上就是实现的整个过程,下面是我在实现过程遇到的各种问题,简单的说一下,如果小伙伴只是想要获得结果。就没有必要去看下面的内容了。
当初在遍历span标签的时候,虽然获取到了元素,但是并没有将其转化成数组,或者说是转换失败,其中的主要原因是自己没有想清楚获取到的time_text这个变量,究竟是什么类型的,这期将用了 typeof、instanceof这些判断符,最后无意中在开发工具中才发现原来使用jquery获取到的是html元素对象,这才使用了 Array.from() 方法将其转换成了数组,还有在向 time()这个函数传参的时候,Date()对象接受的是一个 字符串 类型的参数,所以最初的设想是要把获取到的信息转换成 字符串形式的。不过后来考虑到获取到的文本信息本身就是字符串类型的,最后就把转换字符串这一步给省略掉了。