如何在JavaScript中进行两次比较,以便在NTP时间更新后继续使用?

时间:2017-03-17 20:20:41

标签: javascript ntp

我们有一个JavaScript函数可以获取两个事件的开始和结束时间:

var startTime = new Date().getTime();
// A long running task occurs
var endTime = new Date().getTime();

我们发现的问题是getTime()似乎取决于系统时钟。不幸的是,我们有一些用户的时钟在这两个呼叫之间发生了变化的情况,显然是通过Windows NTP时间更新(即Windows发送到时间服务器以获得准确的时间,然后将系统时钟更改为正确的时间) )。所以我们结束了这样的事情:

startTime = 12:00:00
// 30 second task is kicked off
// NTP time update detects that the system is one minute ahead and corrects the clock
endTime = 11:59:30 // It ended before it began

有没有什么方法可以比较两次以便在NTP时间更新后存活?我们的JavaScript应用程序无法查询公司防火墙之外的任何服务器,因此自行调用NTP服务器是不可能的。

1 个答案:

答案 0 :(得分:0)

就像清洁女工一样:我不做窗户。 所以我的知识是多年来在unix(类似)机器上的各种ntp守护进程。

ntpd不应该作为执行步骤的一般方法,它应该加速并减慢系统时钟。如果它需要做一个步骤你的机器要么开始关闭,要么有一个borked时钟(或只是蹩脚的硬件 - 它们确实存在)。

这意味着在普通条件下,ntpd将确保时间刻度有效连续且没有不连续性(虽然它可能有点快或有点慢)。只有当系统时间和UTC的差异太大而不能考虑“步骤”并且那些可能确实导致时间倒退时才会发生这种情况,但通常情况下,如果它们发生,它们就会被记录。

系统时间步骤也可能导致其他各种问题:例如制造可能会混淆。

Modern ntpd具有配置执行步骤的阈值的选项。

解决方案:

你可能会弄清楚你的机器在哪里记录他们执行NTP步骤,并对此做出反应(这对跨平台来说并不容易)。

使用其他时间测量时间而不是系统时间。

如果你想避免这一切,你最好打赌:自己查询一个公共NTP服务器而不是依赖系统时间,如果这很重要的话。

正如您所述,您不能这样做:通过http查询具有可靠时钟的服务器的时间。获得NTP的准确性并不容易,但如果你测量的是30秒的数量级,那么使用http(s)引入的方差可能是最小的。

如果您确实需要准确性:将HTTP通过http隧道传输到网络服务器并让NTP处理传输延迟。一点'工作',但如果你绝望......

如果您在自己的公司环境中运行此功能,则可以非常轻松地设置自己的ntp服务器。你也可以购买现成的时间服务器(只是为了让你开始:谷歌“Meinberg”,但肯定还有其他人)你甚至可以用ntp广播本地网络的时间。

现在说:我对需要测量应用程序中的已用时间有点奇怪的感觉。

背景资料: http://doc.ntp.org/current-stable/ntpd.html

相关问题