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