Фон
Я декодирую данные из буфера, метка времени которого закодирована в 8 байтов (64 бита).
Обычно это не было бы проблемой, за исключением того, что Number
в JavaScript работает только с числами до 53 бит - тогда он теряет точность.
Проблема
Это означает, что если я сохраню эту метку времени в номере JavaScript, я потеряю точность, поскольку формат числа не достаточно большой, чтобы хранить метку времени.
Поскольку это приложение, требующее точности по времени по крайней мере с точностью до секунды, я не стремлюсь потерять слишком большую точность.
Пример
Чтобы доказать мою точку зрения, вот шестнадцатеричная строка с меткой времени длиной 64 бита. Если вы используете Node.js, вы можете проверить его следующим образом:
//a small timestamp from our current time in history
var buf = Buffer.from(
"162F1544EA81242A",
"hex"
);
buf.readUInt( 0, 6 ); // lost 2 bytes of precision here!
Эта временная метка должна дать некоторое значение в будущем:
Предполагая, что эта метка времени находится в микросекундах (1/1 000 000 секунд):
GMT: четверг, 27 августа 2020 г. 9: 16: 18.476 AM Ваш часовой пояс:
Четверг, 27 августа 2020 года 11: 16: 18.476 по Гринвичу + 02: 00 по летнему времени
Вопрос
- Какую точность (в миллисекундах) потеряет временная метка 64 бита, если она будет сохранена в 53-битном числовом формате JavaScript?