说明
在使用 js 时,经常会有获取时间戳的操作。
可以使用下面的几个方法,获取 13 位的时间戳。
performance.timeOrigin + performance.now()
Date.now()
new Date().getTime()
new Date().valueOf()
Date.parse(new Date())
执行输出:
console.log('performance.timeOrigin + performance.now() ====> ', performance.timeOrigin + performance.now());
console.log('Date.now() ====> ', Date.now());
console.log('new Date().getTime() ====> ', new Date().getTime());
console.log('new Date().valueOf() ====> ', new Date().valueOf());
console.log('Date.parse(new Date()) ====> ', Date.parse(new Date()));

image.png
注意点
时间戳
13位的时间戳,其精度是毫秒(ms)
10位的时间戳,其精度是秒(s)
13位数的时间戳转化为10位数的时间戳 ,除以1000
10位数的时间戳转化为13位数的时间戳 ,乘以1000
13位整数时间戳
使用 performance.timeOrigin + performance.now() 获取的时间戳,带有小数点,但是不能使用 >>0 运算,进行取整。
因为对于整数部分为10位的时间戳,通过位运算可以进行取整(因为目前时间戳1801075039<2147483647),不存在时间戳超过范围的问题。
但是对于13位时间戳,例如 1659658451294>2147483647,此时再通过位运算操作的时候就会导致异常。
这主要是因为在进行位运算之前,JS会先将64bit的浮点数1596615447015.01转为32bit的有符号整型后进行运算。
在 js 中,13位的时间戳超过了整数取值的最大范围(32bit)。
为了验证上述过程,我们再举一个例子:1590015447015.123 >> 0 = 877547495
1590015447015.123的二进制表示为:10111001000110100010011100100111111100111.000111111
舍去其小数部分后,从后往前取32位为:00110100010011100100111111100111
最高位为0,正数,直接转为10进制为:877547495
因此,带有小数点的13位时间戳不能使用位移运算进行取整。
10 位整数时间戳
获取到 13 位整数时间戳除以 1000 即可。