如果系统时钟错误,Javascript的Date()。getTime()会不正确?

时间:2018-02-11 02:25:17

标签: javascript date datetime

我们偶尔会收到用户的报告,我们的应用程序中的倒数计时器设置得太高,或显示负数。我认为这是一个时区问题,但我无法通过更改时钟设置来复制它 - 即使我更改了计算机BIOS中的设置。我能够复制它的唯一方法是从我的代码中的时间戳实际添加或减去3600秒。

我读到Date().getTime()始终提供UTC时间戳。我怀疑它来自互联网,所以对我来说,如果计算机提供的时间错误可能是错误的。不幸的是,我无法让它实际发生。

我也无法在网上找到关于此的更多信息,或从我们的用户那里收集任何数据(这种情况非常罕见,一旦我提到时区和系统时钟,他们就不会感到不情愿了。)

那么,Javascript可以为我提供不正确的UTC时间戳吗?如果是,是否有确保时间戳准确的策略?

编辑 - 让我感到震惊的是,最简单的解决方案可能只是通过服务器发送时间并使用它,因为它不需要特别准确。

1 个答案:

答案 0 :(得分:1)

我想说如果你想深入了解实现 - 去检查Mozilla代码。它是开源的。我因为你的帖子而深入研究它,我终于到达了文件:https://hg.mozilla.org/mozilla-central/file/tip/js/src/vm/Time.cpp

它有一些名为NowCalibrate()的有趣功能。如果系统时间关闭或其他原因,它似乎可以通过修复时间来解决问题。 您可以检查第79到140行。我将附加初始化时间的部分代码。

void
PRMJ_NowInit()
{
    memset(&calibration, 0, sizeof(calibration));

    // According to the documentation, QueryPerformanceFrequency will never
    // return false or return a non-zero frequency on systems that run
    // Windows XP or later. Also, the frequency is fixed so we only have to
    // query it once.
    LARGE_INTEGER liFreq;
    DebugOnly<BOOL> res = QueryPerformanceFrequency(&liFreq);
    MOZ_ASSERT(res);
    calibration.freq = double(liFreq.QuadPart);
    MOZ_ASSERT(calibration.freq > 0.0);

    InitializeCriticalSectionAndSpinCount(&calibration.data_lock, DataLockSpinCount);

    // Windows 8 has a new API function we can use.
    if (HMODULE h = GetModuleHandle("kernel32.dll")) {
        pGetSystemTimePreciseAsFileTime =
            (void (WINAPI*)(LPFILETIME))GetProcAddress(h, "GetSystemTimePreciseAsFileTime");
    }
}

另一方面,我发现每个其他浏览器都有自己的实现,但Mozilla可以成为一个真实世界的例子,说明如何在一段时间后计算和校准初始时间。

相关问题