数学渣渣如何用dateFns或原生js进行时间戳运算
我是个数学特别烂的人,如今机缘巧合做着前端的工作,无可避免与逻辑和运算打交道,最近项目遇到了这类问题,我查找了很多地方却又没有很好的解决方法,我们实习生太苦逼了,所以决定自己写一写吧,请多多包涵!(深情之处用上我最爱的deepink~~)
date-fns ( JavaScript日期实用程序库)
官方文档
进去之后大概是这个样子,这里可以选择自己的安装方式
vue/nuxt
公司项目用的是nuxt,所以也发一下出来,感兴趣的朋友可以稍微了解一下
vue.js文档
nuxt文档
直接进入正题
公司需要我增加个显示时间的功能
//首先引入date-fns
import dateFns from 'date-fns'
//运用dateFns的format,迅速得出进店和离店时间
computed: {
...mapState({
actionInfo: state => state.rawReportData.actionInfo
}),
EntranceTime() {
return dateFns.format(this.actionInfo.enterTime, 'HH:mm:ss')
},
DepartureTime() {
return dateFns.format(this.actionInfo.leaveTime, 'HH:mm:ss')
},
接下来本以为在店时间也是如此滴顺利
//把13位时间戳-毫秒(还有种10位的时间戳代表秒数),/1000转化成秒数,Math.floor向下取整,相减后*1000转化为毫秒
//当时间戳为0,代表北京时间1970/1/1 8:0:0;时间戳为1,代表1970/1/1 8:0:1,以此类推
InstoreTime() {
return dateFns.format(
(Math.floor(this.actionInfo.leaveTime / 1000) -
Math.floor(this.actionInfo.enterTime / 1000)) *
1000,
'HH:mm:ss'
)
在店时间 = 离店 - 进店
划重点!!这一步是为了避免显示在店时间多一秒或者小一秒的情况!!!
本还在感叹我考虑得如此周到,如此天衣无缝,简直是天才,然鹅。。。
我谷歌搜了一圈,貌似是时差的原因,所以会差8小时。强行减去8小时???不知道会的朋友们能不能提供一下解决得思路
为了不辜负看博客得朋友,领导对我得信任,决定原生js手撸一份
//中间发现了一个bug,在店时间应该要能显示大于24小时得,而不是到24小时重新归零
//所以之前的方法是不妥的 let hours = parseInt(msec / (1000 * 60 * 60)) 就很好的解决了这个问题
InstoreTime() {
let msec =
(Math.floor(this.actionInfo.leaveTime / 1000) -
Math.floor(this.actionInfo.enterTime / 1000)) *
1000
let hours = parseInt(msec / (1000 * 60 * 60))
let minutes = parseInt((msec % (1000 * 60 * 60)) / (1000 * 60))
let seconds = parseInt((msec % (1000 * 60)) / 1000)
hours < 10 ? (hours = '0' + hours) : hours
minutes < 10 ? (minutes = '0' + minutes) : minutes
seconds < 10 ? (seconds = '0' + seconds) : seconds
return hours + ':' + minutes + ':' + seconds
}
比如要求小时,想着如何把毫秒转化为小时,emmm,/1000变成秒,/60变成分钟,再/60变成小时,啊哈,这就做出来了
最终!!!
第一次写博客,不知道说什么,就祝大家新年快乐吧!!希望大家都能有所感悟,一起进步!!!