#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));
Это преобразует миллисекунды в формат часов: минут: секунд.