logo
Published on

在JavaScript中获取时间戳的方法

Authors
  • Name
    Twitter

本文提供多种解决方案和描述,如果有任何不清楚的地方,请随时提问。


快速简便的解决方案

;(Date.now() / 1000) | 0

警告: 这种方式可能会在2038年出现问题并返回负数。如果到那时仍需使用,请改用Math.floor()

使用Math.floor()的解决方案

Math.floor(Date.now() / 1000)

Derek 朕會功夫 提供的另类方案

;(new Date() / 1e3) | 0

使用Polyfill使Date.now()在IE中运行

在IE中,你可以使用以下Polyfill(来自MDN):

if (!Date.now) {
  Date.now = function now() {
    return new Date().getTime()
  }
}

关于2038年的日期处理建议

如果你不在乎年份/星期/夏令时方面的问题,需要注意Bitwise操作导致的32位整数使用,而不是64位浮点数。可以如下使用:

Math.floor(Date.now() / 1000)

获取相对时间的代码示例

如果你只想知道代码第一次运行后的相对时间,可以使用如下代码:

const relativeTime = (() => {
  const start = Date.now()
  return () => Date.now() - start
})()

使用jQuery获取时间戳

如果你使用jQuery,可以使用$.now(),详见jQuery文档。这使得Polyfill不再需要,因为$.now()内部其实执行的是(new Date).getTime()

如果你对jQuery的版本感到满意,可以考虑给这个答案点赞,因为不是我最初找到这个方法的。


解释|0的作用

使用|运算符时,你告诉解释器进行二进制或操作。
位运算需要绝对数值,这会将Date.now() / 1000的结果转换成整数。

在该转换过程中,小数被移除,结果类似于使用Math.floor()的输出。

警告: 这会将64位双精度数转换为32位整数。
这在处理大数时会导致信息丢失。
在2038年后,由于32位整数溢出,时间戳将失效,除非JavaScript在Strict模式下改用64位整数。


更多关于Date.now的信息

请访问这篇文章:Date.now() @ MDN