Nodejs 上获取当前时间是调用系统的 api 吗?

发布于 1周前 作者 wuwangju 来自 nodejs/Nestjs

Nodejs 上获取当前时间是调用系统的 api 吗?

虽然 js 不是直接跑在系统里的,但是还是想知道点 node 和系统之间的关系,比如获得时间是不是也是调用的系统 api,和在 windows 下用 ffi 调用它的 api 是否能获得相同的结果?有这方面的大佬吗

9 回复

你除了调用系统 API 还能怎么做?
1、直接和硬件沟通读 CMOS 时间;
2、网络时间。

1 的话,我不知道怎么操作,但结果和系统时间一样,因为系统时间也就是 CMOS 时间…… 除非被 LD_PRELOAD 之类替换掉 syscall ?
2 的话,其中包含 “需要联网” 这一前提和 “通过 NTP 协议进行了交互” 这一 side effect,应当显式指明。


看到问题,我也在想怎么读取时间,你的回答一下打开了思路,貌似只能调用系统 api

你写个程序在死循环里不停取时间,然后 strace 看它用了什么 syscall 就知道了

是的,见 https://sourcegraph.com/github.com/v8/v8@4b9b23521e6fd42373ebbcb20ebe03bf445494f9/-/blob/src/base/platform/time.cc?utm_source=share#L306:7
posix 下用了 gettimeofday
win 下会分两种情况做讨论
都会用到 GetSystemTimeAsFileTime

= = 我应该去掉小尾巴的
不过都在这个文件里面,上下翻一下就行了
JSDate 最后应该是调到这个地方的

clock_gettime 很巧的是大部分时候 strace 看不见,因为时间相关可以用 vDSO,而不用真的 syscall。

既然是 vDSO,那么它就能在用户态实现。实现上根据要求的精度不同会有差异,其中之一落到 rdtsc 指令

至于是如何调用的,就得具体情况具体分析。如果通过 glibc 调用 clock_gettime 函数,那么会走 vDSO。

也可以像 go runtime 做的那样,直接解析 auxv、解析符号、调用 vdso。

也可以直接 syscall 225 (大概是这个数,不确定),这样就不是通过 vdso 的,strace 就能看见。当然,在一些极端情况下,vdso 会 fallback 到系统调用上。

node 是啥情况可能得自己探索一番,也无外乎这几样了。

(最近了解了一些这方面知识,因为在做一个运行时注入程序修改时间的工具😅用来做 chaos )

想问一下“win 下会分两种情况做讨论”具体是什么情况?

在 Node.js 中获取当前时间并不直接调用系统的 API,但它是通过内置的 Date 对象实现的,该对象在底层与系统的时钟进行交互。Date 对象在 Node.js 和浏览器环境中都有提供,并且它的实现通常依赖于底层操作系统的时间服务。

以下是一个简单的示例,展示了如何在 Node.js 中获取当前时间:

// 获取当前时间
const now = new Date();

// 打印当前时间
console.log(now.toString());

// 如果需要特定格式的时间,可以使用以下方法
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1
const day = String(now.getDate()).padStart(2, '0');
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');

const formattedDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
console.log(formattedDate);

在这个例子中,new Date() 创建了一个包含当前日期和时间的 Date 对象。然后,我们可以使用 Date 对象的方法(如 getFullYear()getMonth()getDate() 等)来获取年、月、日、时、分、秒,并格式化输出。

虽然 Date 对象在底层可能与系统时间服务进行交互,但 Node.js 提供了高级抽象,使得开发者无需直接处理这些底层细节。

回到顶部