Объект Date в Firefox всегда возвращает миллисекунды, округленные до сотен

#javascript #datetime #firefox #rounding

#javascript #дата-время #firefox #округление

Вопрос:

Я обнаружил это поведение случайно, когда недавно использовал console.time . В Firefox он всегда возвращает либо 0 мс, либо 100 мс. Это происходит потому, что дата всегда округляется до сотен миллисекунд. Например, new Date() вернет 1552469978800 вместо 1552469978877 . Знаете ли вы, с каких это пор это происходит или как я могу получить точное время? Также влияет на setTimeout и setInterval .

Ответ №1:

Это происходит потому, что дата всегда округляется до сотен миллисекунд.

Я не вижу такого поведения ни в Firefox v65 на * nix, ни в v48, v56, v57 или v65 на Windows.

Но если это происходит в некоторых версиях или на некоторых платформах, возможно, это был ответ на Spectre. По той же причине альтернатива, на которую я бы указал ( performance.now ), менее полезна, чем была бы в противном случае, потому что:

Временная метка на самом деле не имеет высокого разрешения. Чтобы уменьшить угрозы безопасности, такие как Spectre, браузеры в настоящее время округляют результаты в разной степени. (Firefox начал округлять до 1 миллисекунды в Firefox 60.) Некоторые браузеры также могут слегка рандомизировать временную метку. Точность может снова улучшиться в будущих версиях; разработчики браузера все еще исследуют эти временные атаки и способы их наилучшего смягчения.

Комментарии:

1. Я использую Firefox v65 в Linux, а также протестирован на Firefox v64, результаты для обоих округлены. Вероятно, на некоторые платформы это действительно не влияет. Спасибо за ответ!

2. @lamka02sk — Я тоже использую Linux, так что это … странно.

Ответ №2:

Наконец-то найден окончательный ответ на эту проблему. Вся проблема заключается в privacy.resistFingerprinting настройке, включенной по умолчанию в последних версиях Firefox.

Защита от отпечатков пальцев, вероятно, создает больше проблем, чем пользы в этом случае. Теперь вы совершенно не можете правильно установить часовой пояс в Javascript, поэтому некоторые веб-приложения, например Slack, всегда будут показывать время GMT 0 вместо вашего фактического времени.

Также еще одна неприятная вещь заключается в том, что анимации JavaScript (особенно влияющие на плагины jQuery), которые используют функции setInterval or setTimeout , теперь выполняются со скоростью 10 кадров в секунду.

Когда вы отключаете защиту от отпечатков пальцев, все работает нормально после перезагрузки браузера.

Ответ №3:

Попробуйте это:

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

Это преобразует миллисекунды в формат часов: минут: секунд.