PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые темы

Как получить разницу во времени между тем которое прислал сервер и Date.now?

Продвинутые темы

Разницу между серверным временем и `Date.now()` вычисляют как `Date.now() - serverTime` (оба в миллисекундах). Полученное смещение используют для коррекции клиентских часов.

Вычисление разницы

Серверное время (обычно приходит как timestamp или ISO-строка) и Date.now() приводят к миллисекундам и вычитают:

const serverTime = Date.parse(serverDateString); // ISO → мс
// или serverTime уже в мс

const clientTime = Date.now();
const offset = clientTime - serverTime; // разница в мс

offset > 0 — клиентские часы спешат; < 0 — отстают.

Из HTTP-заголовка Date

Сервер присылает заголовок Date:

const res = await fetch('/api/time');
const serverTime = new Date(res.headers.get('Date')).getTime();
const offset = Date.now() - serverTime;

Учёт задержки сети (точнее)

Простое вычитание не учитывает время передачи. Точнее — по формуле, схожей с NTP:

const t0 = Date.now();          // отправка
const serverTime = await getServerTime();
const t1 = Date.now();          // получение
const roundTrip = t1 - t0;
const estimatedServerNow = serverTime + roundTrip / 2; // компенсация
const offset = Date.now() - estimatedServerNow;

Применение

Скорректировать клиентское время серверным:

const correctedNow = Date.now() - offset; // "серверное" время на клиенте

Для таймеров, синхронизации, дедлайнов, где важно единое время.

Коротко для собеседования

Разницу вычисляют Date.now() - serverTime (оба в мс; серверное из timestamp/заголовка Date через Date.parse/new Date().getTime()). Для точности учитывают задержку сети (компенсация roundTrip / 2, как в NTP). Смещение (offset) используют для коррекции клиентских часов серверным временем — важно для синхронизации и дедлайнов.

Другие вопросы раздела