Дата получения() не обновляется

#javascript #date #validation #timestamp

Вопрос:

У меня есть приложение, выполняющее некоторые HTTP-запросы, и каждый раз, когда я отправляю запрос в API, мне нужно отправлять в заголовке параметр метки времени, он должен быть целым числом, и число никогда не должно быть таким же или ниже предыдущего.

Поэтому, чтобы справиться с этим, я использую простое решение:

 const timestamp = Math.round(new Date().getTime() / 1000)
 

Как вы, ребята, знаете, это всегда будет генерировать число больше, чем предыдущее. Но иногда он просто не обновляется должным образом. Я делаю новый запрос каждые 10 секунд, но иногда число, генерируемое функцией, остается тем же, что и 10 секунд назад… Как???

Поэтому мне нужно решение этой проблемы

PS.: Я также пробовал использовать Date.now() , и появляется та же проблема

Комментарии:

1. что произойдет, если вы попробуете «разрешить метку времени» вместо «постоянная метка времени»

2. Я не понимаю, как это может гарантировать, что одна отметка времени не совпадает с предыдущей. Если вы выполните этот код дважды менее чем за одну секунду, он будет иметь одно и то же значение дважды. Более того, возможно, что системные часы будут скорректированы во время выполнения вашего кода, и это может привести к тому, что эта метка времени вернется назад.

3. Если вам нужно значение времени в секундах, Date.now() / 1000 | 0 это намного меньше кода.

Ответ №1:

Я вижу, вы сказали, что выполняете новый запрос только каждые 10 секунд, поэтому мой комментарий о том, что меньше одного раза в секунду, не должен применяться.

Корректировка часов не должна быть частой проблемой, но это может произойти, если время вашего компьютера синхронизировано с сервером времени, а его внутренние часы не очень точны, поэтому время от времени требуется настройка более 10 секунд, когда системные часы повторно синхронизируются.

Единственный способ решить эту проблему (если это проблема) — отследить последнюю выпущенную вами метку времени и сделать что-то вроде этого:

 let lastTimestamp = 0; // Outside of the function wrapping the code below
   //
const timestamp = Math.max(Math.round(Date.now() / 1000), lastTimestamp   1);
lastTimestamp = timestamp;