Firefox中的日期对象总是返回毫秒,四舍五入到数百

时间:2019-03-13 09:44:38

标签: javascript datetime firefox rounding

我最近使用console.time时偶然发现了此行为。在Firefox中,它总是返回0ms或100ms。发生这种情况是因为日期总是四舍五入到几百毫秒。例如,+new Date()将返回1552469978800而不是1552469978877。您知道什么时候起这件事,或者我怎么可能获得确切的时间?也影响setTimeoutsetInterval

3 个答案:

答案 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时间,而不是您的实际时间。

另一个烦人的事情是,使用setIntervalsetTimeout函数的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));

这会将毫秒转换为小时:分钟:秒格式。