龙空技术网

JS Date对象的妙用:如何更优雅的计算时间差?

前端梁哥 115

前言:

如今朋友们对“js时间计算天数”大致比较着重,大家都想要分析一些“js时间计算天数”的相关知识。那么小编同时在网摘上收集了一些关于“js时间计算天数””的相关文章,希望你们能喜欢,各位老铁们快快来学习一下吧!

Date是JS中用于处理日期时间的核心对象。熟悉Date对象,可以使我们的日期处理代码写的更优雅。现在,进入正题:如何更优雅的计算时间差?

最近,接手了一套前端祖传项目,是N年前一个C#工程师写的,里面有一个计算时差函数是这么写的:

/*************************************************	 * 计算时差	 */	function calculateTimeSpan(begTime)	{ 		var date3=new Date().getTime()-begTime.getTime() ;  //时间差的毫秒数		if(date3 <0) date3 = 0 ;		//计算出小时数		var leave1=date3%(24*3600*1000)   ; //计算天数后剩余的毫秒数		var hours=Math.floor(leave1/(3600*1000));		//计算相差分钟数		var leave2=leave1%(3600*1000)       ; //计算小时数后剩余的毫秒数		var minutes=Math.floor(leave2/(60*1000));		//计算相差秒数		var leave3=leave2%(60*1000);      //计算分钟数后剩余的毫秒数		var seconds=Math.round(leave3/1000);	    return 	 hours+":"+minutes+":"+seconds ;	}

上面的函数,大家能看懂吗?是不是觉得理解起来很吃力?这个函数接收一个开始日期时间,计算距离当前日期时间的时间差,最后返回一个截掉年月日,以时分秒表示的时间字符串。

虽然Date对象有一个getTime方法,但实际上,我们永远都不需要使用它。为什么呢?因为有更好的方法替代它。

获取当前时间的时间戳,除了getTime,还有如下方式:

const ms = Date.now()
const ms = +new Date()

是不是都比getTime写的更少?实际上,日期之间的算术运算并不需要手动转化为时间戳数值,JS内部会进行临时自动类型转化,将Date对象转化为时间戳再进行运算。计算时间差,我们可以直接这么写:

const timeSpan = new Date() - begTime

上面的计算时差函数,我这里有一个更简洁且易于理解的解决方案。就是根据任意年月日创建一个日期对象,此时它的时分秒都是0。然后,我们调用它的setMilliseconds方法,将时差毫秒传入,最后返回以它的时分秒表示的字符串即可。代码如下:

/** * 计算时差 * @param {Date} beginTime  */const calcTimeSpan = beginTime => {  const date = new Date(2000, 1, 1)  date.setMilliseconds(Math.max(new Date() - beginTime, 0))  return `${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}` }

仅需3行代码,我们便实现了与上面9行代码相同的功能,而且简洁很多。大家都能看懂吧?这个方案是不是很好理解?

若大家还有不明白的地方,欢迎评论区问我。感谢阅读!

标签: #js时间计算天数