gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:25:51 25 4
gpt4 key购买 nike

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

我读到 Date().getTime() 始终提供 UTC 时间戳。我怀疑它来自互联网,所以对我来说,如果计算机提供的时间不正确,它可能是错误的,这是有道理的。不幸的是我还不能让这件事真正发生。

我也无法在网上找到太多有关此问题的信息,也无法从我们的用户那里收集任何数据(这种情况非常罕见,一旦我提到时区和系统时钟,他们就会毫不奇怪地不愿意提供帮助)。

那么,Javascript 能否为我提供不正确的 UTC 时间戳?如果是这样,是否有策略来确保时间戳准确?

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

最佳答案

我想说,如果你想深入了解实现 - 去检查 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 可以成为一个真实世界的示例,说明如何在特定时间段后计算和校准初始时间。

关于javascript - 如果系统时钟错误,Javascript的Date().getTime()会不正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48727670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com