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