2011-02-02 11 views
20

setTimeoutを1分後に設定してからシステム時間を過去5分間に変更した場合、setTimeout関数は6分でトリガされることに気付きました。JavaScript setTimeoutとシステム時間の変更により問題が発生する

私は、システムクロックに対する夏時間の変更中に何が起こるのかを見たいと思ったからです。

JavaScriptウェブページではsetTimeout機能を使用して5秒ごとに自動的にページを更新し、夏時間が発生するとページ情報が1時間フリーズします。回避策はありますか?

編集:私はAjaxを使用してページを更新していますが、ページ全体を更新したくありません。

+0

どのブラウザを使用していますか? –

+8

夏時間の変更が発生した場合は、実際にはタイムゾーンオフセットの変更であり、UTCへの変更はありません。実行したテストは、DSTがシステムによって自動的に処理される場合、実際に何が起こるかをモデル化しません。しかし、コンピュータの時計がリアルタイムから遠くに漂っていた場合、自動的に時刻を同期させるように[うるう秒数](http://en.wikipedia.org/wiki/Leap_second)にも問題が残る可能性があります時間を変えてください)。 – PleaseStand

+0

私はIE7、IE8、IE9、Firefox、およびWindows 7のChromeでこれをテストしましたが、あなたが説明する動作は表示されません。これはOS固有のものでしょうか? – gilly3

答えて

4

私がやることは、新しいAjaxリクエストを開けることから5秒ごとに変更して、Comet(長いポーリング)を使用することです。これは、サーバーが必要なときに毎回ブラウザに新しい結果をプッシュするため、サーバー側で5秒ごとに、または新しい情報が利用可能になるたびに、新しい結果をブラウザーにプッシュするため、より良いオプションです。

Webソケットを使用し、Cometをフォールバックとして使用する方がよいでしょう。これはFayeまたはsocket.oiで簡単に実装できます。

CometD o Apeのような他のオプションがあります。

+0

+1ウェブソケット。 – Raynos

0

メタタグの更新を使用してこれを行うことができます。このコードは、ページごとに5秒更新します:javascriptの質問については

<meta http-equiv="refresh" content="5"> 

を、それだけでブラウザがsetTimeoutメソッドを処理する方法であるかもしれません。設定された時間にコードを実行するようにブラウザに指示し、クロックが変更されると、クロックが変更される前の時点でコードが実行されますか?ちょうど推測ですが、次回はsetTimeoutを使用することを念頭に置いておく必要があります。

編集:OK、それはajaxでは機能しません もう一度編集:これは本当に良い質問です。私は上記のようにsetTimeoutが機能すると確信していますが、うわー、これは脳のお誘いです。

+0

質問を編集して、Ajaxを使用してページを更新していて、リフレッシュできないことを追加しました。 –

4

代わりsetTimeoutの使用setIntervalとあなたの問題を解決しなければならない:)

更新:

をあなたが本当にのsetTimeoutかのsetIntervalのいずれかを使用できない場合は、簡単なHTMLをロード隠しiframeを持つように試みることができますページは次のようになります。

もしあなたが幸運であれば、メタリフレッシュは同じ問題を引き起こしません。

もう1つの解決方法は、イベント発射をserver push経由でサーバーに移動することです。これを行わない理由はたくさんありますが、イベントを集中化してサーバーに負担をかけることは少なくありませんが、最後の手段と考えることができます。

+0

残念ながら、これはこの問題を解決しませんでした。同じことが起こります。 –

+0

不幸にもsetIntervalは非常に悪いです。 – Raynos

+0

それは奇妙な - あなたはどのようなOSですか?どのブラウザーでもwin7 64bitでsetIntervalでこの問題を再現することはできません。 –

0

if (Date in range foo)チェックを行うことができます。基本的に、現在のタイムスタンプが夏時間の5秒以内であるかどうかをチェックしてから、ただちにsetTimeoutを使用してページをリフレッシュしてください。

この方法では、ユーザーは既知の時間の変更の近くで小さな迷惑になりますが、ページは1時間フリーズしません。

1

最近この問題も発生しました。私の場合、時間の変更は深刻な金銭的損失を引き起こす可能性があるので、真剣にそれを取らなければなりませんでした。

いくつかの背景:

  • IEとOperaは適切に(setTimeoutを、のsetIntervalには副作用を)システム時刻の変更を処理しません。
  • FF < 4.0そしてすべてのWebkitベースのブラウザは、(正確に説明したとおりに)過去の時間の変更を処理できません。注:ただし、Chromeのタイマーは、約2〜60秒後に停止します。

私の解決策:ユーザーの操作(つまり、mousemove、mouseoveなど)から何らかのイベントを使用して、時間の変更チェックを開始します。

Clock.prototype.checkLocalTime = function(){ 
var diff = Date.now()- this.lastTimestamp; 
if (diff < 0 || diff > 20000) { // if time shifted back or more than 20s to the future 
    console.warn('System time changed! By ' + diff + 'ms'); 
    this.restartTimer(); 
    this.getServerTime(); 
} 
this.lastTimestamp = time; 

}

私はタイマーを再起動気づき、さらにサーバーとの時間を同期させることができたよう。

関連する問題