2016-10-11 2 views
3

アプリケーションでは、UTC DateTimeをDataBaseに保存しています。クライアント(javascript)がLocal TimeZoneでdatetimeを送信していて、コントローラのレベルで、データベースに日付を保存する前にUTC時刻に変換しています。サーバーからクライアントへのUTCオフセット

クライアントとサーバーのタイムゾーンが異なります。

我々は、だから我々は再びコントローラでローカルのDateTimeへのDateTimeを変換する必要があり

DateTime.SpecifyKind(_CreatedDate, DateTimeKind.Utc); 

とEntity Frameworkのを使用してUTCでデータベースから日付を取得しているか、我々はクライアント側ですべてのDateTime変換ロジックを処理する必要があります。

答えて

4

DateTimeインスタンスをサーバーに送信するときは、の変換は可能な限り早く行う必要があります。この場合、クライアントによって、そしてクライアントがjavascriptであるので、方法toUTCStringを使用することができます。あなたがmomentjsを使用しているなら、utcを使うことができます。

DateTimeサーバからの変換の変換をできるだけ遅く行うべきである場合。作成した永続日付/取得日付がUTCであることを確認してください。ここでも、クライアントをローカル日付時刻インスタンスに変換する必要があります。

最後に、ISO8601形式を使用して、クライアントとサーバーの間ですべてのdatetimeインスタンスを送信します。 Momentjs、javascriptの日付オブジェクト、json.netがこれを行うことができます。これにより、何も失われず、文化固有のバグも導入されません。

なぜそれがクライアントで処理されるべきかについては、非常に簡単で、そこでそれを行うのが最も簡単です。クライアントだけが本当にタイムゾーンを知っていますが、これは通常サーバー側で「正確に推測」するのは非常に困難です。これを行わない唯一の理由は、ユーザーのタイムゾーン情報をプロファイルに保存したい場合でも、これは非常に難しい(ユーザーが移動した場合や場所を移動した場合など)。

永続化の方法として、DateTime型またはオフセット型のDateTimeを使用できます(実際の型名は、使用しているRDBMによって異なります)。あなたが選択したものは、それが保存された瞬間のutcからのオフセットを知ることが重要であるかどうかに依存するはずです。これまで私はこれを行う必要はありませんでしたが、多分あなたのために重要です。 DateTimeはUTCの時点を表す必要があり、オフセットは現地時間をUTCの時点に戻すためのオフセットで表す必要があるため、実際の時点に影響はありません。

+0

基本的に言えば、ローカルからUTCまたはUTCからローカルへの変換はすべてクライアント側で行う必要があります –

+1

@vikas - はい、クライアント/ブラウザーは自分自身のタイムゾーンを知っていなければなりませんので、その責任をそのタイムゾーンに移すのが理にかなっています。例:momentjsインスタンスでtoLocalを呼び出すだけで、utc datetimeがそのロケール(ブラウザマシンに登録されている)の正しいdatetimeに変換されます。クライアントがUTCとして日時スタンプを送信するのも、同じ理由で意味があります。 – Igor

1

ここでは、私たちのプロジェクトでそれをやっています。私の意見では、データベースにdatetimeoffsetを使用しているはずです。これにより、日付が保存されたタイムゾーンを特定できるようになります。クライアントからサーバーに日付を送信するときは、datetimeoffsetに送信されていることを確認してください。

datetimeoffsetをサーバーからクライアントに送信すると、クライアント側で変換を実行できます。 MomentJS Timezoneがこのための最良のライブラリだと誰も主張していないと思います。それを見て、それを撃つ。 DateTimeOffset

DateTimeOffsetにエラボレーション

http://momentjs.com/timezone/

のDateTimeOffset除く日時のような別のデータ型がタイムゾーンを決定するオフセット時間を加算しています。たとえば、セントラルタイムゾーンにいて、時間が08:00 amであるとします。さて、Datetimeoffsetでは、08:00:00:00 -04:00のようにオフセットが-4(中央タイムゾーン)であると宣言しています。これは読んでいるときにあなたの頭の中で何らかの数学をする必要がなく、あなたは本当に変換を行う必要がないので(MomentJSがあなたのためにそれをするように)、簡単になります。あなたがそれを読んだとき、あなたはいつも "ああ、それは時間を節約した人のために午前8時だった。そして、彼らはセントラルタイムゾーンでそれを保存したように思える。"

+0

この文脈で 'datetimeoffset'について詳しく説明してください。私は' datatimeoffest'がどのように私を助けてくれるのでしょうか? –

+0

@vikas私はちょうど答えを改訂しました – James

+0

@vikas DateTimeOffsetを使用した場合、クライアントにdatetimeoffset値を送信すると、オフセット値が返されます。そのオフセット値を使用して、時間が保存された時間を知ることができます – James

1

が変換するのに適切な時間である場合、それはかなり相対的なのでです。

私が思う唯一の絶対的なルールはこれです。

UTC時間がために任意のタイムゾーンへの任意の他の変換は、単に「表示」である

のみ実、意味のあるデータである私

あなたと同じようにだから、同じ規則に従います残りのデータ。

ブール値をビュー上のチェックボックスに変換するのと同様です。または、そのチェックボックス値をブール値としてサーバーに送信します。

そして、それはそれはまたはUIに達する最も早いのです。

+0

クライアント側で日付を比較するときに直面している問題。入力された日付が現地のタイムゾーンにあるため、このシナリオであなたのソリューションが私たちを助けてくれますか? –

+1

DateTime Pickerから読み込んだ時刻を即時に変換し、クライアント側での比較もUTCで行われます。 あなたの価値がUIを離れたので(例えばピッカー)、utcに変換する時間です。 UIのままにすると、ピッカーから読み込み、値としてjavascript関数に送信することもできます –

関連する問題