如何在Node.js中获取准确的UTC纳秒时间戳

tvmytwxo  于 2023-06-29  发布在  Node.js
关注(0)|答案(3)|浏览(152)

python3可以运行以下构造:

from datetime import datetime
print({'timestamp':str(int(datetime.utcnow().timestamp() * (10**9)))})

这将输出类似JSON的结构:

{'timestamp': '1567658264143923968'}

现在我想在Node.JS 12中得到类似的结果。

  • 我需要一根绳子
  • 我需要1970年以来的UTC戳,但自机器 Boot 后就不需要了
  • 误差不超过最后4位(微秒精度或更高)

因此int的32位不能成为限制。(这在2019年第三季度不会成为问题,因为Node 10支持bigint)。
操作系统也不能造成这样的限制,因为WinAPI有GetSystemTimePreciseAsFileTime,*nix有clock_gettime(CLOCK_MONOTONIC),两者都比1us好
如何在NodeJS中获得纳秒UTC时间戳字符串?

  • Date.now()+"000000"显示缺少最后6位数(米利斯),但任务为4(micros或更好)
  • This 7yo question似乎解决了一般的时间戳问题,而hrtime只会让你得到机器的正常运行时间,而不是真实的的UTC时间。结果将与Python无关。

还有其他选择吗?

UPD

现在,我可以稍微改变一下问题的措辞。从非常简单的Angular 来看,Nodejs可以被视为一个独立于操作系统的运行时库。你写一个js代码,它在所有平台上都能正常工作。所以它必须将大多数可行的函数绑定到js接口;定时器功能就是其中之一。正如我们看到的,单调时钟QueryPerformanceCounter()调用通过process.hrtime()绑定
node.js中的哪个函数会导致linux上的clock_gettime(3)调用,或windows上的GetSystemTimePreciseAsFileTime()调用,并以微秒精度或更好的精度将结果返回给js?

dba5bblo

dba5bblo1#

我的临时解决方案:

let startNs = process.hrtime();
let startMs = new Date().getTime();
function nanoseconds() {
  let diffNs = process.hrtime(startNs);
  let endMs = new Date().getTime();
  if (Math.abs(diffNs[0] * 1000 - (endMs - startMs)) > 3000) {
    startNs = process.hrtime();
    startMs = new Date().getTime();
    diffNs = process.hrtime(startNs);
  }
  let bi= BigInt(startMs) * 1000000n +  BigInt(diffNs[0]) * 1000000000n + BigInt(diffNs[1]);
  return bi.toString();
}
hc8w905p

hc8w905p2#

如果您正在寻找的分辨率是微秒,那么process.hrtime()应该足够了。

const hrTime = process.hrtime()
console.log(hrTime[0] * 1000000 + hrTime[1] / 1000)

或者,您可以使用timestamp-nano
如果你需要更高的精度,你可以自己构建一个native node模块:https://medium.com/the-node-js-collection/n-api-next-generation-node-js-apis-for-native-modules-169af5235b06
或者,如果你真的喜欢Python,你可以从Node执行一个Python脚本:How to call a Python function from Node.js

idv4meu8

idv4meu83#

对于最新版本的Node,process.hrtime.bigint()似乎提供了这一点。

相关问题