Получение времени в миллисекундах с эпохи события в javascript

avatar
space_food_
1 июля 2021 в 19:51
66
1
0

Я пытаюсь получить время с начала эпохи в миллисекундах события в javascript, но когда я это делаю

alert('event at exactly' + event.timeStamp);

Он печатает числа в диапазоне от 8000 до 10000 или немного больше.

Миллисекунды с начала эпохи обычно представляют собой числа вида 1519211809934

Что мне здесь не хватает? Как правильно получить миллисекунды с начала эпохи для точного времени запуска события?

Источник

Ответы (1)

avatar
raina77ow
1 июля 2021 в 19:52
2

Ну, event.timeStamp измеряет что-то совершенно другое:

Это значение представляет собой количество миллисекунд, прошедших с начала времени жизни текущего документа до создания события.

Если вы хотите получить точное время возникновения события, вы должны вместо этого добавить его значение в performance.timeOrigin. Обратите внимание, что последний не поддерживается Safari.

В качестве альтернативы вы можете инициировать событие самостоятельно на этапе инициализации вашего приложения, затем просто сравнить его отметку времени с Date.now() и использовать разницу в качестве отправной точки документа. Это может быть полезно, если существует значительная задержка цикла событий, вызывающая несоответствие между теми измерениями, о которых вы беспокоитесь.

Обратите внимание, что (судя по комментариям) вы все равно можете получить некоторые колебания, поскольку некоторые браузеры имеют тенденцию быть менее точными с этими данными:

Чтобы обеспечить защиту от атак по времени и снятия отпечатков пальцев, точность Event.timeStamp может быть округлена в зависимости от браузера настройки.

В Firefox предпочтение privacy.reduceTimerPrecision включается по умолчанию и по умолчанию 20 мкс в Firefox 59; в 60 это будет 2мс. [...]

Если вы также включите privacy.resistFingerprinting, точность будет равна 100 мс или значение privacy.resistFingerprinting.reduceTimerPrecision.microseconds, в зависимости от того, что больше.

space_food_
1 июля 2021 в 19:55
0

Это даст точное время в миллисекундах времени, когда вызывается Date.now(). Насколько я понимаю, это может немного отличаться в миллисекундах. Я хочу ТОЧНОЕ время в миллисекундах события, в идеале до миллисекунды.

Charlie Bamford
1 июля 2021 в 20:08
0

Это экспериментальная функция спецификации. Это зависит от браузера, если и как это реализовать.

space_food_
1 июля 2021 в 20:20
0

Это экспериментальная функция, поэтому ее нельзя будет постоянно использовать. Есть ли способ получить точное время начала жизни текущего документа?

raina77ow
1 июля 2021 в 20:36
0

Обновил ответ еще раз, описав возможные подходы в этом случае - и оговорку о методах resistFingerprinting.

raina77ow
1 июля 2021 в 20:40
0

Что касается уровня экспериментальности — ну, этот API должен заменить PerformanceTiming на тот, который считается устаревшим, да все еще поддерживается всеми браузерами (включая Safari).