如何在JavaScript中获取时间戳?

4800

我希望有一个单一的数字来表示当前日期和时间,就像Unix时间戳一样。

43个回答

5984

毫秒级时间戳

要获取自Unix纪元以来的毫秒数,请调用Date.now:

Date.now()

或者,使用一元运算符+调用Date.prototype.valueOf

+ new Date()

或者,直接调用valueOf

new Date().valueOf()

为了支持IE8及更早版本(请参见兼容性表),请为Date.now创建一个shim
if (!Date.now) {
    Date.now = function() { return new Date().getTime(); }
}

或者,直接调用getTime:

new Date().getTime()

秒级时间戳

要获取自Unix纪元以来的秒数,即Unix时间戳

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

另一种方法是使用按位或运算取整,速度略快,但可读性较差且可能会在将来出现问题(参见解释12):

Date.now() / 1000 | 0

毫秒级时间戳(更高分辨率)

使用 performance.now:

var isPerformanceSupported = (
    window.performance &&
    window.performance.now &&
    window.performance.timing &&
    window.performance.timing.navigationStart
);

var timeStampInMs = (
    isPerformanceSupported ?
    window.performance.now() +
    window.performance.timing.navigationStart :
    Date.now()
);

console.log(timeStampInMs, Date.now());


14
如果您想知道“加号”的逻辑是什么:+被用作toInt(),它会忽略所有字符,只返回数字。 - Umair Riaz
或者使用在线工具:https://magictools.dev/#!/tools/timestamp-to-date - WJA

630

我喜欢这个,因为它很小:

+new Date

我也喜欢这个,因为它同样简短并且兼容现代浏览器,而且有超过500人投票认为它更好:

Date.now()

13
据我记得,我在两个建议的解决方案中各计算了1M次时间戳,并计算了平均运行时间。我在Firefox和Chrome上运行它,发现getTime在这两个浏览器中都更快。即便如此,即使new Date().getTime()略微慢一些,我也会选择它。幸运的是,更快的解决方案已经是易于阅读的解决方案! - inanutshellus
11
同意@FabrícioMatté的观点。一元运算符的行为可能不是很基础,但如果你没有进行过复习,就不要指望能够在许多团队中有效地工作。 - Jason
10
那是因为你将它和另一个字符串连接起来了。这种情况下,会调用new Date().toString() - kirb
3
在这种情况下,“+”是一种一元数学运算符。typeof (+new Date())的结果为“number”。基本上,它是new Date().valueOf()的简写形式,不需要调用JavaScript函数。但不要这样写,看起来像一个打字错误。 - ansiart
3
@FelixGagnon-Grenier 我添加了 Date.now(),因为它现在是首选方式,很多人不喜欢 +new Date。我喜欢 daveb 的答案现在包括 +new Date,并解释了它,但以前它没有。 - xer0x
显示剩余6条评论

317

JavaScript使用自纪元以来的毫秒数,而大多数其他编程语言使用秒数。你可以使用毫秒数,但是一旦将值传递给PHP等其他语言,原生函数可能会失败。因此,为确保安全起见,我总是使用秒而非毫秒。

以下代码会给你一个Unix时间戳(以秒为单位):

var unix = Math.round(+new Date()/1000);

这会给你距离纪元以来的毫秒数(不是Unix时间戳):

var milliseconds = new Date().getTime();

我更喜欢这个答案,因为它没有偷偷带入对Math.floor()的明显偏见。Math.floor()的舍入误差可高达一秒钟,而Math.round()的误差仅接近半秒钟。我认为支持Math.floor()的论点是它避免了一个在技术上稍微超前的“现在”时间戳。相比之下,一个更过去的“现在”时间戳为什么会比这更严重呢?仅仅因为Math.floor()不能产生一个“未来”的时间戳,而选择潜在更不准确的方法,这显得过于考虑了。 - undefined

164
我在这个答案中提供了多种解决方案及其描述。如果有什么不清楚的地方,请随时提问。
快速而简单的解决方案:
Date.now() /1000 |0

警告:如果您使用|0操作符,可能会在2038年出现错误并返回负数。请在那时改用Math.floor()

Math.floor()解决方案:

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

以下是来自Derek 朕会功夫在评论中提出的一些有趣的替代方案:

new Date/1e3|0

获取Date.now()的Polyfill:

为了在IE中让它工作,您可以这样做(来自MDN的Polyfill):

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

如果您不关心日期/星期几/夏令时,需要记住在2038年之后的日期中使用位运算将导致使用32位整数而不是64位浮点数。您需要正确使用它:
Math.floor(Date.now() / 1000)

如果您只想知道代码第一次运行的相对时间,可以使用以下代码:
const relativeTime = (() => {
    const start = Date.now();
    return () => Date.now() - start;
})();

如果您使用jQuery,您可以像jQuery的文档中描述的那样使用$.now(),这使得polyfill过时了,因为$.now()在内部执行相同的操作:(new Date).getTime()。如果您只是对jQuery的版本感到满意,请考虑点赞this答案,因为我自己没有找到它。
现在简单解释一下|0的作用:
使用|,可以告诉解释器进行二进制OR运算。
位运算需要绝对值,这将把Date.now() / 1000的十进制结果转换为整数。
在转换过程中,小数部分被删除,结果类似于使用Math.floor()输出的结果。 请注意:它会将64位双精度浮点数转换为32位整数。
处理大数时会导致信息丢失。
除非JavaScript转到Strict模式下的64位整数,否则时间戳将在2038年之后由于32位整数溢出而损坏。

如需了解更多关于Date.now的信息,请访问此链接: Date.now() @ MDN


162
var time = Date.now || function() {
  return +new Date;
};

time();

102
var timestamp = Number(new Date()); // current time as number

95

除其他选项外,如果您想要ISO日期格式,您可以直接获取它

console.log(new Date().toISOString());


64

54

日期是 JavaScript 中的一个本地对象,用于获取有关时间的所有数据。

请注意,在 JavaScript 中,时间戳取决于客户端计算机设置,因此它不是100%准确的时间戳。要获得最佳结果,您需要从服务器端获取时间戳。

无论如何,我更喜欢使用原生JavaScript,以下是一种常见的做法:

Date.now(); //return 1495255666921

在 MDN 中如下所述:

Date.now() 方法返回自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的毫秒数。
因为 now() 是 Date 的静态方法,所以您始终使用它作为 Date.now()。

如果您使用的是 ES5 以下版本,则 Date.now(); 不起作用,您需要使用:

new Date().getTime();

谢谢,我在网上查了很多答案,得出了这个结论,但没有人能够确认。 - electronixG

52

性能

今天 - 2020.04.23,我对选择的解决方案进行了测试。我在 Chrome 81.0、Safari 13.1 和 Firefox 75.0 上的 MacOs High Sierra 10.13.6 上进行了测试。

结论

  • 解决方案Date.now()(E)在 Chrome 和 Safari 上是最快的,在 Firefox 上排名第二,这可能是快速跨浏览器解决方案的最佳选择
  • 解决方案performance.now()(G)令人惊讶的是,在 Firefox 上比其他解决方案快100倍以上,但在 Chrome 上最慢
  • 解决方案C、D、F在所有浏览器上都相当缓慢

enter image description here

细节

Chrome 的结果

enter image description here

您可以在此处的本机上执行测试

在下面的代码片段中使用了在测试中使用的代码

function A() {
  return new Date().getTime();
}

function B() {
  return new Date().valueOf();
}

function C() {
  return +new Date();
}

function D() {
  return new Date()*1;
}

function E() {
  return Date.now();
}

function F() {
  return Number(new Date());
}

function G() {
  // this solution returns time counted from loading the page.
  // (and on Chrome it gives better precission)
  return performance.now(); 
}



// TEST

log = (n,f) => console.log(`${n} : ${f()}`);

log('A',A);
log('B',B);
log('C',C);
log('D',D);
log('E',E);
log('F',F);
log('G',G);
This snippet only presents code used in external benchmark


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接