2

私はそのようなコードを順番に持っています:

  var d0 = new Date();
  ... 
  ...
  var d1 = new Date();

  if (d0>d1) {
    console.log("Problem");
  }

最初に見てください。d1がd0より古いわけではありません。しかし、私は2日前に実稼働サーバーでそれを経験しました。d1はd0より数ミリ秒古いです。どうしてそれができますか?

そして、Date()は何から来ていますか?V8からですか?またはOSシステムから?

4

2 に答える 2

4

システムを詳しく調べずに言うのは難しいでしょうが、一般に、日付と時刻のライブラリを使用したプログラミングは、実際には非常に奇妙な場合があることを覚えておいてください。

推奨読書:Falsehoodsプログラマーは時間について信じています

私は最近、本番ボックスのv8で同様の問題を経験しました。(私たちが思うに)起こっていたのは、ネットワークタイムデーモンがシステムのクロックを変更していたことでした。そのため、コード実行の途中でシステムクロックがNTPによって再同期されていたため、「終了時刻」が「開始時刻」の前に来るというプロファイリングが非常にまれに発生しました。

于 2012-10-11T00:47:22.220 に答える
3

多くのサーバーは、システム時刻をより高い権限に同期する何らかの方法を使用しています(NTPまたはその他のプロトコルを使用)。この同期は定期的に行われ、システムのクロックを同期に戻すために必要な場合は、時刻が逆方向に移動する可能性があります。これは独自のコードとは非同期に行われるため、これら2つのnew Date()呼び出しの間に発生する可能性があります。

の価値は、new Date()最終的にはV8が時間を取得するために呼び出しているOSからもたらされます。

于 2012-10-11T00:42:39.960 に答える