你如何在 JavaScript 中获得时间戳?

IT技术 javascript datetime timestamp date-arithmetic
2021-01-23 04:09:18

类似于 Unix 的时间戳,它是代表当前时间和日期的单个数字。无论是数字还是字符串。

6个回答

短而时髦:

+ new Date()

一元运算符 likeplus触发对象中valueOf方法Date并返回时间戳(没有任何更改)。

细节:

在几乎所有当前浏览器上,您都可以使用Date.now()毫秒为单位获取 UTC 时间戳一个值得注意的例外是 IE8 及更早版本(请参阅兼容性表)。

不过,您可以轻松地为此制作一个垫片:

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

要以为单位获取时间戳,您可以使用:

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

或者,您可以使用:

Date.now() / 1000 | 0

这应该稍微快一点,但可读性也较差。
(另请参阅this answerthis以及对按位运算符的进一步解释)。

我建议使用Date.now()(与兼容性垫片)。它稍微好一点,因为它更短并且不会创建新Date对象。但是,如果您不想要垫片和最大兼容性,您可以使用“旧”方法以毫秒为单位获取时间戳

new Date().getTime()

然后您可以将其转换为如下所示的秒数:

Math.round(new Date().getTime()/1000)

你也可以使用valueOf我们上面展示方法:

new Date().valueOf()

以毫秒为单位的时间戳

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

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

如果您想知道plussign的逻辑是:+用作toInt()它将忽略所有字符并仅返回数字的地方
2021-03-12 04:09:18

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

+new Date

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

Date.now()
@Billy 我记得,我计算了两个建议解决方案中的时间戳,每个解决方案 100 万次,并计算了平均运行时间。我在 Firefox 和 Chrome 中运行它,getTime 在两种浏览器中都更快。也就是说,即使它(稍微)慢一点,我也会选择new Date().getTime(). 对我来说幸运的是,更快的解决方案已经是清晰的解决方案!
2021-03-10 04:09:18
+ 在这种情况下是一元数学。typeof (+new Date()) 计算结果为“数字”。基本上它是 new Date().valueOf() 的简写——没有 javascript 函数调用。但是不要这样写,它看起来像一个错字。
2021-03-10 04:09:18
@Niklaus 那是因为您将它连接到另一个字符串。在这种情况下,new Date().toString()被称为。
2021-03-11 04:09:18
同意@FabrícioMatté。一元运算符的行为可能不是基本的,但如果你还没有复习它,不要指望能够在很多团队中有效地发挥作用。
2021-03-12 04:09:18
@FelixGagnon-Grenier 我添加了,Date.now()因为它现在是首选方式,而且很多人不喜欢+new Date. 我喜欢那个 daveb 的答案现在包括+new Date,并解释了它,但它也不习惯。
2021-04-06 04:09:18

JavaScript 使用自纪元以来的毫秒数,而大多数其他语言使用秒数。您可以使用毫秒,但是一旦您传递一个值来表示 PHP,PHP 本机函数可能会失败。所以为了确保我总是使用秒,而不是毫秒。

这将为您提供 Unix 时间戳(以秒为单位):

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

这将为您提供自纪元以来的毫秒数(不是 Unix 时间戳):

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

time();

我在此答案中提供了多种带有描述的解决方案。如果有什么不清楚的,请随时提出问题


快速而肮脏的解决方案:

Date.now() /1000 |0

警告如果您使用魔法,可能会在 2038 年中断并返回负数|0使用Math.floor(),而不是由时间

Math.floor() 解决方案:

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

Derek 朕会功夫的一些书呆子替代品来自此答案下方的评论:

new Date/1e3|0

Polyfill 开始Date.now()工作:

为了让它在 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,您可以$.now()按照jQuery 文档中的说明使用,这会使 polyfill 过时,因为在$.now()内部执行相同的操作:(new Date).getTime()

如果您只是对 jQuery 的版本感到满意,请考虑对这个答案进行投票,因为我自己没有找到它。


现在对什么|0了一个小小的解释

通过提供|,您可以告诉解释器进行二元 OR 运算。
位运算需要绝对数,将十进制结果从Date.now() / 1000整数转换为整数。

在该转换过程中,小数被删除,导致与 usingMath.floor()输出的结果相似

但请注意:它会将 64 位双精度数转换为 32 位整数。
这在处理大量数字时会导致信息丢失。
由于 32 位整数溢出,时间戳将在 2038 年之后中断,除非 Javascript 在严格模式下移动到 64 位整数。


有关Date.now点击此链接的更多信息Date.now()@ MDN