【问题标题】:Is there any way to get current time in nanoseconds using JavaScript?有没有办法使用 JavaScript 以纳秒为单位获取当前时间?
【发布时间】:2011-05-14 15:29:57
【问题描述】:

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

【问题讨论】:

    标签: javascript time precision time-precision


    【解决方案1】:

    【讨论】:

    • Chrome 24 前后移除了“webkit”前缀。developer.mozilla.org/en-US/docs/Web/API/…
    • 请注意 window.performance.now() 返回相对于页面的 navigationStart 而不是 UNIX 纪元的时间。有关当前时间的代码 sn-p,请参见下面的答案。
    • 然而,微秒不是纳秒,所以performance.now()在这里没用。
    • 显然,出于安全考虑,浏览器实际上并没有返回纳秒精度,根据您链接的 MDN 网站上的提示:“[B] 浏览器目前在不同程度上对结果进行了四舍五入。 […] 一些浏览器也可能会稍微随机化时间戳。”
    • “根据您发布的链接,performance.now() 方法返回一个 DOMHighResTimeStamp,以毫秒为单位”。毫秒不是纳秒。
    【解决方案2】:

    是的!试试优秀sazze的nano-time

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

    【讨论】:

    • NB -- 仅适用于节点 -- 使用 process.hrtime() (@TahsinTurkoz),然后从中计算绝对时间。
    【解决方案3】:

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

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

    (performance.now() + performance.timeOrigin)
    

    来自the specification的相关引用

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

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

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

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

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

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


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

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

    【讨论】:

    • 这是你能得到的最接近的。
    • 也许你应该提到它使用小数返回。所以它仍然是毫秒,所以我们不必经历那个错误。
    【解决方案4】:

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

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

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

    【讨论】:

    • 警告 performance.timing.navigationStart 已被弃用。
    【解决方案5】:

    在 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);
    }

    【讨论】:

    • 当使用 Node 7.4.0 和 7.5.0 时,这不会返回当前时间戳。
    • 我碰巧在process.hrtime的api中看到了这个:“这些时间是相对于过去的任意时间,与一天中的时间无关,因此不受时钟漂移的影响。主要用途是测量间隔之间的性能”。
    【解决方案6】:

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

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

    【讨论】:

    • +1 ...您为什么要这样做?如果它需要 那个 精确,那么它可能一开始就不应该是 JavaScript。 PS:嘿,mod:删除火焰 cmets 应该保持有效 cmets 完好无损。只是一个想法。
    • 你知道删除了所有的cmets吗?
    • @evandentremont 微秒比纳秒高出整整 三个 个数量级!
    • 再次讨论这个问题,基准测试并不是时间精度的唯一用例。有一些算法可能需要用到,如果我想在浏览器上运行,JS 是必须的。
    • @EduardoMelo 例如,页面错误模拟器中的 LRU 替换(我现在正在做的一个项目)。毫秒精度不够好,因为代码运行太快,而且我页面上的时间戳在每 1k 页左右都有相同的值...
    【解决方案7】:

    JavaScript 以毫秒为单位记录时间,因此您无法获得该精度的时间。 smart-aleck 的答案是“乘以 1,000,000”。

    【讨论】:

    • 这实际上正是我想要的,我实际上并不关心纳秒时间只需要一个日期来进入正确的格式;)
    猜你喜欢
    • 1970-01-01
    • 2019-02-04
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多