66

所以,我知道我可以使用 JavaScript 以毫秒为单位获取当前时间。但是,是否有可能以纳秒为单位获取当前时间?

4

7 回答 7

84

在大多数浏览器中实现微秒级精度,使用:

window.performance.now()

也可以看看:

于 2012-08-09T18:40:28.927 回答
12

基于 Jeffery 的回答,为了获得绝对时间戳(正如 OP 所希望的那样),代码将是:

var TS = window.performance.timing.navigationStart + window.performance.now();

结果以毫秒为单位,但据报道是一个浮点值“精确到千分之一毫秒”。

于 2015-12-24T22:48:34.010 回答
8

在 Node.js 等服务器端环境中,您可以使用以下函数以纳秒为单位获取时间

function getNanoSecTime() {
  var hrTime = process.hrtime();
  return hrTime[0] * 1000000000 + hrTime[1];
}

也以类似的方式获得微秒:

function getMicSecTime() {
  var hrTime = process.hrtime();
  return hrTime[0] * 1000000 + parseInt(hrTime[1] / 1000);
}

于 2016-02-27T21:22:16.063 回答
6

是的!试试优秀的sazze的纳米时间

let now = require('nano-time');
now(); // '1476742925219947761' (returns as string due to JS limitation)
于 2017-02-17T04:02:39.110 回答
5

不,您不可能在 JavaScript 层获得纳秒级精度。

如果您尝试对一些非常快速的操作进行基准测试,请将其放入一个运行数千次的循环中。

于 2011-05-14T15:32:15.367 回答
4

自 UNIX 纪元以来的毫秒数,分辨率为微秒。

performance.timing.navigationStart已被弃用!请改用以下内容:

(performance.now() + performance.timeOrigin)

规范中的相关引用

该规范定义了一个 API,它以亚毫秒分辨率提供时间来源和当前时间,使其不受系统时钟偏差或调整的影响。

timeOrigin属性必须返回一个表示对象的相关全局对象时间源时间戳DOMHighResTimeStamp的高分辨率时间。Performance

时间原点时间戳是时间原点为零的高分辨率时间值。

时间原点是测量时间的时间值

now()方法必须返回当前的高分辨率时间

当前高分辨率时间是从时间原点到当前时间(通常称为“现在”)的高分辨率时间。


请注意,出于安全原因,实际上它并不准确(防止侧信道攻击)

该规范定义了一个提供亚毫秒级时间分辨率的 API,它比DOMTimeStamp. 然而,即使没有这个新的 API,攻击者也可以通过重复执行和统计分析获得高分辨率估计。为确保新 API 不会显着提高此类攻击的准确性或速度,该DOMHighResTimeStamp类型的最小分辨率应足够不准确以防止攻击:当前建议的最小分辨率不小于 5 微秒,必要时应为由用户代理设置更高,以解决由于架构或软件限制或其他考虑引起的隐私和安全问题。

于 2020-05-04T13:13:19.720 回答
2

JavaScript 以毫秒为单位记录时间,因此您将无法获得该精度的时间。聪明的回答是“乘以 1,000,000”。

于 2011-05-14T15:33:53.767 回答