Объект даты в Firefox всегда возвращает миллисекунды, округленные до сотен - PullRequest
0 голосов
/ 13 марта 2019

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

Ответы [ 3 ]

1 голос
/ 13 марта 2019

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

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

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

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

0 голосов
/ 24 апреля 2019

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

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

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

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

0 голосов
/ 13 марта 2019

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

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

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

...