有没有办法使用JavaScript获得当前时间(以纳秒为单位)?

EdM*_*elo 42 javascript precision time time-precision

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

Jef*_*kin 64

使用以下方法在大多数浏览器中实现微秒精度:

window.performance.now()
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • 根据您发布的链接,“performance.now() 方法返回一个 DOMHighResTimeStamp,以毫秒为单位”。毫秒不是纳秒。 (4认同)
  • 请注意,window.performance.now() 返回相对于页面 navigationStart 的时间,而不是相对于 UNIX 纪元的时间。请参阅下面我的回答,了解当前时间的代码片段。 (3认同)
  • 然而,微秒不是纳秒,所以`performance.now()`在这里没用. (3认同)
  • 显然,出于安全考虑,浏览器实际上不会返回纳秒精度,根据您链接的 MDN 网站上的提示:“[B]浏览器当前对结果进行了不同程度的舍入。[...]某些浏览器也可能会稍微随机化时间戳。” (2认同)

Ron*_*enz 10

基于Jeffery的答案,获得绝对时间戳(如OP所希望的)代码将是:

var TS = window.performance.timing.navigationStart + window.performance.now();
Run Code Online (Sandbox Code Playgroud)

结果是以毫秒为单位,但据报道是" 精确到千分之一毫秒 " 的浮点值.

  • **警告** `performance.timing.navigationStart` 已被弃用。 (3认同)

Tah*_*koz 9

在像Node.js这样的服务器端环境中,您可以使用以下函数来获得以纳秒为单位的时间

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

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

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

  • 使用 Node 7.4.0 和 7.5.0 时,这不会返回 CURRENT 时间戳。 (4认同)
  • 我碰巧在`process.hrtime`的api中看到:“这些时间相对于过去的任意时间,与一天中的时间无关,因此不受时钟漂移的影响。主要用途是测量性能间隔之间”。 (3认同)

Кон*_*Ван 9

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

\n

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

\n
(performance.now() + performance.timeOrigin)\n
Run Code Online (Sandbox Code Playgroud)\n
\n

规范中的相关引用

\n
\n

该规范定义了一个 API,它提供时间原点和亚毫秒分辨率的当前时间,这样就不会受到系统时钟偏差或调整的影响。

\n

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

\n

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

\n

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

\n

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

\n

当前高分辨率时间是从时间原点到当前时间的高分辨率时间(通常称为\xe2\x80\x9cnow\xe2\x80\x9d)。

\n
\n
\n

请注意,实际上出于安全原因(以防止旁路攻击),它并不那么准确

\n
\n

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

\n
\n


111*_*134 6

是的!尝试一下出色的sazze纳米时间

let now = require('nano-time');
now(); // '1476742925219947761' (returns as string due to JS limitation)
Run Code Online (Sandbox Code Playgroud)

  • 注意——仅适用于节点——使用“process.hrtime()”(@TahsinTurkoz),然后从中计算绝对时间。 (5认同)

Lig*_*ica 5

不可以.您在JavaScript层无法获得纳秒精度.

如果您正在尝试对某些非常快速的操作进行基准测试,请将其置于运行它几千次的循环中.

  • 恢复此讨论,基准测试不是时间精度的唯一用例.有一些算法可能需要它,如果我想在浏览器上运行它,JS是必需的. (5认同)
  • +1 ......为什么你想要?如果它需要*那个*精确它首先应该不是JavaScript.*PS:嘿,mod:删除火焰评论应保留有效评论.只是一个想法.* (2认同)
  • @EduardoMelo例如,在页面故障模拟器中更换LRU(我正在研究的项目).毫秒精度不够好,因为代码运行*太快*我的页面上的时间戳每1k页左右都有相同的值... (2认同)