データベースのバックアップを実行する機能があります。この関数を 24 時間に 1 回実行したいと考えています。これを行うために私が思いついた方法を以下に示します。
const backupTime = '7:10'
setInterval(()=>{
const d = new Date().toString();
const currentTime = d.substr(16,5); //24hr time
if(currentTime === backupTime){
//backup db
}
},60000)
これは機能しますが、ユーザーがバックアップ時刻を 07:10 に設定すると、関数は setInterval の呼び出しが行われた秒に実行されます。つまり、7:09:59 に作成され、タイムアウトが 60 秒の場合、setInterval は 7:10:00 ではなく 7:10:59 に実行されます。これはユーザーにバックアップを通知するという点で良い UX とは言えません。などが起こっています。
指定された時刻に正確に実行できるようにすることはできますか?
2
@CertainPerformance 電子アプリケーション内にあるため、クライアントになります。これは sqlite3 データベースです
– SRR
2020 年 9 月 3 日 2:45
ヒント: プロセスが停止すると終了する可能性があるタイマーに依存するのではなく、必要に応じて 1 分ごと、または必要に応じて 1 秒ごとに次のバックアップ時刻が到来したかどうかを確認してください。正確には違いますが、 new Date() > のようなものです。 nextBackupTime。
– タッドマン
2020 年 9 月 3 日 2:45
1
次のバックアップ時間まで何ミリ秒かを計算し、単一の setTimeout を設定するだけではどうでしょうか?また、Date#toString に依存しないでください。これにより、ユーザーのロケール設定に応じて異なる出力が提供されます。適切な日付解析を使用してください。
– ニート・ザ・ダーク・アブソル
2020 年 9 月 3 日 2:47
1
その通りですが、== で正確な時刻を確認するのではなく、>= を確認してください。 toString() を気にせず、日付と日付を比較してください。次回の時刻を事前に計算してどこかに保存し、バックアップが完了したときにその時刻を 24 時間早めます。
– タッドマン
2020 年 9 月 3 日 2:50
1
一般的なパターンは、関数内でタイムアウトを使用し、同じ関数を呼び出すことです。実行の最後に次のようにします。 gist.github.com/tehsis/38899f3d5c6789344f2054d6d7a843ce 。とはいえ、使用している時間を考えると、おそらく大丈夫かもしれません :)
– テシス
2020 年 9 月 3 日 3:01
------------------------
setInterval または setTimeout は、正確な瞬間については信頼できません (特にミリ秒をカウントする場合)。
もちろん、ここでの要件では 1 秒のオフセットが許可されていると思います。
したがって、解決策は次のようになります。
const backupTime = '7:10'
let justFired = false;
setInterval(()=>{
const d = new Date().toString();
const currentTime = d.substr(16,5); //24hr time
if(currentTime === backupTime && !justFired){
justFired = true;
//backup db
} else if (currentTime !== backupTime && justFired) {
justFired = false;
}
},1000) // call every second