我最近使用console.time
时偶然发现了这种行为。在Firefox中,它总是返回0ms或100ms。发生这种情况是因为日期总是四舍五入到几百毫秒。例如,+new Date()
将返回1552469978800
而不是1552469978877
。你知道从什么时候开始,或者我怎样才能获得准确的时间?也影响setTimeout
和setInterval
。
发生这种情况是因为日期总是四舍五入到几百毫秒。
我没有在* nix上的Firefox v65中看到这种行为,也没有在Windows上看到v48,v56,v57或v65。
但如果它发生在某些版本或某些平台上,它可能是对Spectre的回应。出于同样的原因,我会指出(performance.now
)的替代方案没有其他方面有用,因为:
时间戳实际上不是高分辨率。为了缓解诸如Spectre之类的安全威胁,浏览器目前对结果进行了不同程度的舍入。 (Firefox在Firefox 60中开始四舍五入到1毫秒。)有些浏览器也可能会略微随机化时间戳。在未来的版本中,精度可能会再次提高;浏览器开发人员仍在调查这些时间攻击以及如何最好地缓解它们。
终于找到了这个问题的最终答案。整个问题是在最新版本的Firefox中默认启用了privacy.resistFingerprinting
设置。
在这种情况下,指纹识别保护可能会带来更多问题。您现在完全无法在Javascript中正确设置时区,因此一些Web应用程序,例如Slack将始终显示GMT + 0时间而不是您的实际时间。
另一个恼人的事情是使用setInterval
或setTimeout
函数的JavaScript动画(特别是影响jQuery插件)现在以每秒10帧的速度运行。
禁用指纹识别保护后,重启浏览器后一切正常。
试试这个:
function convert( ms ) {
var seconds = ms / 1000;
var hours = parseInt( seconds / 3600 );
seconds = seconds % 3600;
var minutes = parseInt( seconds / 60 );
seconds = seconds % 60;
var pad = function(x) { return (x < 10) ? "0"+x : x; }
return pad(hours)+":"+
pad(minutes)+":"+
pad(seconds);
}
var time = 100000000;
console.log(convert(time));
这会将毫秒转换为小时:分钟:秒格式。