我们偶尔会收到用户的报告,我们的应用程序中的倒数计时器设置得太高,或显示负数。我认为这是一个时区问题,但我无法通过更改时钟设置来复制它 - 即使我更改了计算机BIOS中的设置。我能够复制它的唯一方法是从我的代码中的时间戳实际添加或减去3600秒。
我读到Date().getTime()
始终提供UTC时间戳。我怀疑它来自互联网,所以对我来说,如果计算机提供的时间错误可能是错误的。不幸的是,我无法让它实际发生。
我也无法在网上找到关于此的更多信息,或从我们的用户那里收集任何数据(这种情况非常罕见,一旦我提到时区和系统时钟,他们就不会感到不情愿了。)
那么,Javascript可以为我提供不正确的UTC时间戳吗?如果是,是否有确保时间戳准确的策略?
编辑 - 让我感到震惊的是,最简单的解决方案可能只是通过服务器发送时间并使用它,因为它不需要特别准确。
答案 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可以成为一个真实世界的例子,说明如何在一段时间后计算和校准初始时间。