10

たとえば、ユーザーがアプリケーションサーバーとは異なるタイムゾーンでブラウザーから私のWebアプリを実行しているとします。date.getTime()JavaScriptのメソッドを使用して、クライアント側で日付をシリアル化します。結果のミリ秒をJson経由で送信し、を呼び出してサーバー側にJavaDateオブジェクトを作成しますnew Date(millisecondsFromJS)。私はそれをMySqlに保存し、それを取得し、Javaを呼び出して再度シリアル化し、date.getTime()Jsonを介してクライアントにもう一度送信します。

これらのミリ秒でJavaScriptDateオブジェクトを作成すると、元の日付になりますか?このプロセスは正常に完了しましたが、クライアントとサーバーは現在同じタイムゾーンにあります。タイムゾーンが異なる場合、プロセスで日付が破損するかどうかはわかりません。

私が理解しているように、getTime()を使用すると、タイムゾーンに依存しない瞬間が返されます。ユーザーが2012年7月17日午後4時39分CDTをキャプチャした場合、サーバーはそれを2012年7月17日午後11時39分CESTとして保存する可能性がありますが、サーバーがGMTからミリ秒に変換すると、クライアントはこれらのミリ秒からの日付では、元の2012年7月17日午後4時39分CDTを正常に再構築できたはずです。これは本当ですか?

4

2 に答える 2

12

Dropboxで学んだスケーリングのレッスン、パート1の記事にいくつかの良いアドバイスがありました:

すべてをUTCで内部的に保持してください!サーバーの時間、データベースの内容など。これにより、夏時間だけでなく、多くの頭痛の種を節約できます。一部のソフトウェアは、UTC以外の時間を適切に処理しないため、実行しないでください。UTCに設定された壁の時計を維持しました。ユーザーに時間を表示する場合は、タイムゾーンの変換が最後の1秒で行われるようにします。


UNIX時間のミリ秒をサーバーに送信すると、ユーザーが選択した時点がわかります。次に、サーバー上のすべてをUTCで処理し、ミリ秒の整数をクライアントに返します。

クライアント/JavaScript:

var date = new Date();
var clientMilliseconds = date.getTime();
// send clientMilliseconds to server

サーバー/Java:

Date date = new Date(clientMilliseconds);
// store the date, then get it back
long serverMilliseconds = date.getTime();
// send serverMilliseconds back to client

クライアント/JavaScript:

var date = new Date(serverMilliseconds);
// If receiving the error "Invalid Date", serverMilliseconds
// needs to be converted to an Integer. Consider:
// parseInt: parseInt(serverMilliseconds, 10)
// unary +:  (+serverMilliseconds)

途中でdate、サーバーとクライアントのオブジェクトは両方ともそれぞれのタイムゾーンを反映するため、両方を見ると異なるように見えるかもしれませんが、同じタイムゾーンを使用してUTCに戻すとそうではありません。


だからあなたの質問に答えるために:

これらのミリ秒でJavaScriptDateオブジェクトを作成すると、元の日付になりますか?

はい。

JavaのDate(long date)コンストラクタgetTime()メソッドはUNIX時間ミリ秒で動作します。JavaScriptgetTime()Dateコンストラクターもそうです。協定世界時(GMT / UTC)以外のタイムゾーンはありません。

于 2012-07-17T22:14:27.133 に答える
2

いくつかの問題があります

  • クライアントは異なるタイムゾーンにあります。UTCによると、エポック以降のmsを使用するため.getTime()、などを使用する場合、これは実際には問題になりません。.valueOf()
  • 本当の問題は、クライアントの時計がずれている可能性があることです。たとえば、一部のプログラムを登録する必要がないように、誰かがコンピュータを時間に戻した場合、クライアントは誤ったタイムスタンプを生成します。
  • また、時計がそのように不正確であるという理由だけで、わずかな歪度を持つ可能性があります

サーバーからタイムスタンプを送信し、それをクライアントから生成されたタイムスタンプと比較して、歪度オフセットを取得することで、これに対抗できます。次に、この歪度オフセットをnew Date.getTime()クライアントで生成するすべてのに適用します。ただし、クライアントがページを使用しているときにシステム時刻を変更した場合、これは機能しません。

于 2012-07-17T21:47:36.653 に答える