Начальный интервал, когда начинается следующая минута - PullRequest
1 голос
/ 19 марта 2019

В приложении для работы с календарем / календарем, над которым я работаю, отображается строка, указывающая текущее время. Я хочу обновлять положение этой строки каждую минуту.

Если я запускаю функцию setInterval, когда компонент календаря монтируется или монтируется, происходит изменение, которое начинается на 59-й секунде (или просто не на 1-й секунде), и время всегда будет отличаться от времени, когда устройство показывает (компьютер, смартфон, ...).

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

РЕДАКТИРОВАТЬ: Текущий код

componentDidMount() {
    setInterval(() => {
        this.setState({ currentTime: new Date() })
    }, 60 * 1000);
}

Ответы [ 2 ]

1 голос
/ 19 марта 2019

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

(function showTime(){
  console.log('update time');
  var time = document.getElementById('time');
  var now = new Date();
  
  time.innerHTML = `${now.getHours()}:${now.getMinutes()}`;
  setTimeout(showTime, (60 - now.getSeconds()) * 1000);
})();
<div id="time"></div>
0 голосов
/ 19 марта 2019

Используйте SetTimeout для вызова функции, которая исправляет любое отклонение для каждой итерации и перезапускается с новым вызовом setTimout.

function repairAndRelaunch (cnt) {
    // capture current secs
    var secs = (new Date()).getSeconds();
    // relaunch with corrected seconds - limit iterations for testing
    if (5 > cnt++) setTimeout('repairAndRelaunch(' + cnt + ')', (60-secs)*1000); 
    // log to observe discrepencies
    console.log('for cnt = ' + cnt + ', secs = ' + secs);
};

// test control flow
window.onload = function() {repairAndRelaunch(0);};
...