Firefox中的日期对象始终返回舍入为数百的毫秒

问题描述 投票:0回答:3

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

javascript datetime firefox rounding
3个回答
1
投票

发生这种情况是因为日期总是四舍五入到几百毫秒。

我没有在* nix上的Firefox v65中看到这种行为,也没有在Windows上看到v48,v56,v57或v65。

但如果它发生在某些版本或某些平台上,它可能是对Spectre的回应。出于同样的原因,我会指出(performance.now)的替代方案没有其他方面有用,因为:

时间戳实际上不是高分辨率。为了缓解诸如Spectre之类的安全威胁,浏览器目前对结果进行了不同程度的舍入。 (Firefox在Firefox 60中开始四舍五入到1毫秒。)有些浏览器也可能会略微随机化时间戳。在未来的版本中,精度可能会再次提高;浏览器开发人员仍在调查这些时间攻击以及如何最好地缓解它们。


0
投票

终于找到了这个问题的最终答案。整个问题是在最新版本的Firefox中默认启用了privacy.resistFingerprinting设置。

在这种情况下,指纹识别保护可能会带来更多问题。您现在完全无法在Javascript中正确设置时区,因此一些Web应用程序,例如Slack将始终显示GMT + 0时间而不是您的实际时间。

另一个恼人的事情是使用setIntervalsetTimeout函数的JavaScript动画(特别是影响jQuery插件)现在以每秒10帧的速度运行。

禁用指纹识别保护后,重启浏览器后一切正常。


-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));

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

© www.soinside.com 2019 - 2024. All rights reserved.