date = new Date(); date.valueOf() vs Date.now()

48

我开始学习 JavaScript。我请教了同事如何获取当前时间。

他告诉我可以使用以下代码:

> date = new Date()
> date.valueOf()

但大多数人都是这样做的:

> Date.now()
第二种方法更简单易懂。如果我想说服我的同事使用第二种方法,我应该如何向他解释这种差异?

2
他/她使用第一个版本的原因是什么? - Sirko
Date.now() 在 IE8 中不被支持,因此一些人避免使用它。 - Ramanlfc
你也可以使用(new Date()).valueOf()来实现。 - Dai
1
@Sirko 他也不知道。 - user5456386
有些人喜欢使用 getTime() 的原因是为了与 new Date("2020-11-22").getTime(); 保持一致性,他们说得有道理。记住一个函数的默认/无参数版本比记住第二个函数要容易得多。 - MarkHu
4个回答

56

在JavaScript中获取当前时间有几种方法:

如评论和MDN链接所提到的,Date.now()在Internet Explorer 8中不受支持。因此,如果需要IE 8兼容性,则应使用new Date().valueOf(),但可能会降低代码可读性。

或者,如果您希望使用Date.now()但必须与不支持它的浏览器兼容,可以将以下代码放置在JavaScript文件的某个位置中,以添加支持。

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

46

2019年答案

由于我们不再关心IE8,因此只有两种方法是有意义的:

  • new Date() - 创建一个代表当前日期/时间的Date对象
  • Date.now() - 返回自1970年1月1日UTC 00:00:00以来经过的毫秒数

(在旧版回答中提到的另外两种方法与Date.now()在功能上等效,但看起来更丑并且适用于IE8。)

作为一种风格,我发现在处理时间间隔(通常是将较早日期减去较晚日期以计算流逝时间)的代码中使用Date.now()更清晰,而在时间戳(例如写入数据库的时间戳)中使用new Date()


11
阅读MDN后,似乎new Date().getTime()new Date().valueof()Date.now()在功能上是等效的。然而,Date.now()仅受支持于不同版本的浏览器中,最重要的是IE9。因此,如果需要支持IE9之前的版本,则可能需要使用polyfill。
编辑:实际上,唯一的问题就是IE。这不总是吗? ;)

8

当我需要时间戳时,通常使用+new Date()+ new Date().toString(36)

最近我改用 Date.now(),因为它更有效率,或将来会更有效率。

技术上,操作系统将日期时间报告为原始数据,通过调用 new Date(),JavaScript引擎必须创建一个带有原型的对象(通过引用传递,并且稍后必须进行垃圾收集),然后再调用另一个valueOf函数。

但是Date.now可能是全局Date对象的静态函数,它对从操作系统报告的值执行简单的数学运算。

我没有检查所有JavaScript引擎的源代码,以确保Date.now不会创建日期实例,但它更有效率,或将来会更有效率。

编辑 我查看了quickjs和Date.now() 更加高效

new Date() https://github.com/bellard/quickjs/blob/master/quickjs.c#L42079

Date.now() https://github.com/bellard/quickjs/blob/master/quickjs.c#L41996


1
这应该是被接受的答案,因为它是唯一一个明显区分替代方案的答案。 - Nino Filiu

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