4


2

ASP.NETでアプリケーションのタイムゾーンを定義して、現在のサーバー時刻との間で読み取られたすべての時刻が暗黙的に変換されるようにする方法はありますか。

3 Answer


3


ASPの最新の進化についてはよくわかりませんが、このhttp://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/772971a4-9f1b-4004-a873-c1e0e2098852/ 2006年の記事]興味深い答えを提供します。

_ 問題は、タイムゾーン情報がWebブラウザーから直接利用できないことです。 ヒューリスティックを使用して正しいタイムゾーンを判断するか、ユーザーの選択に基づいてユーザーのタイムゾーン設定を保存する必要があります。 _

Net 3.5とそのhttp://msdn.microsoft.com/ja-jp/library/system.timezoneinfo.converttime.aspx[TimeZoneInfo..ConvertTime]メソッドでは、次に続くものは必要ないかもしれませんが、それでも完全性のために:

_ _ タイムゾーンの設定が完了したら、時間を変換する必要があります。 *あなたは常にあなたの日付/時刻の値をUTC *のDBに格納するべきです。 これにより、多くの変換の問題が解消されます。 情報をUTCに格納する場合は、データを表示するときにUTCからユーザーのローカルタイムゾーンに変換するだけで済み、それらから日付/時刻の値を取得するときにはタイムゾーンからUTCに変換する必要があります。

これをさらに難しくしているのは、TimeZoneクラスがそれほど有用ではないという事実です。 幸い、v2.0ではDateTimeが更新され、時刻がUTCであるかどうかの指標をサポートするようになりました。 * DateTime.ToUniversalTimeメソッドを使用してDateTimeをUTCに変換できます。 残念ながらただし、元に戻すことはできません*。

ToLocalTimeメソッドは、ローカルタイムゾーンを使用します。これは、サーバー上で実行すると、サーバーのタイムゾーンを使用しない欲しいもの ただしさらに悪いのは、TimeZoneオブジェクトを単純に作成してそのサポートが存在しないためにそれを使用できないことです。

Michael Brummは、タイムゾーンを簡単に作成および使用できるようにするために、素晴らしいhttp://www.michaelbrumm.com/simpletimezone.html[littleクラス]を作成しました。 私は個人的に自分のアプリでそのコードの大幅に修正されたバージョンを使用しています、そしてそれはうまく働きます。 これは、DB UTC値からローカルユーザーのタイムゾーンに変換する手順です。 _ _

1)ユーザー用に格納されたタイムゾーン値を取得します2)それをラップするSimpleTimeZoneクラスを作成します(DB値を基になるWindowsレジストリバージョンにマップするマッピングスキームを使用)。3)SimpleTimeZone.ToLocalTimeメソッドを使用して変換します。現地時間に対するDateTime値。

_ _ パフォーマンス上の理由から、おそらくSimpleTimeZoneインスタンスを取得して初期化し、リクエストの長さだけItemsプロパティにキャッシュして、作成し続ける必要がないようにしてください。

ユーザーのローカルタイムゾーンからUTCに変換するには、逆の操作を行います。 _ _

1)格納されたタイムゾーン値をユーザーから取得します。2)それをラップするためのSimpleTimeZoneクラスを作成します。3)DateTimeをUTCに変換するためにSimpleTimeZone.ToUniversalTimeメソッドを使用します。


1


内部的に DateTime.UtcNowを使用してください。 .NET 3.5の場合は、 TimeZoneInfo.ConvertTimeを調べてください。


1


この質問に直接答えてください。

_ ASP.NETのアプリケーションのタイムゾーンを定義して、現在のサーバー時間から読み取られた/現在のサーバー時間と比較されるすべての時間が暗黙的に変換されるようにする方法はありますか? _

いいえ、これは不可能です。 .NETには、スレッド単位またはアプリケーション単位でローカルタイムゾーンを変更するメカニズムはありません。 コードが実行されているマシンのタイムゾーン設定によってのみ、システム全体で変更できます。 https://stackoverflow.com/a/19254366/634824 [この回答も参照してください]。

_ . または私はそれぞれとして変換ステートメントを入れる必要がありますか DateTime.Now call? _

Webアプリケーションでは DateTime.Now`を使ってはいけません。 サーバーのタイムゾーン設定は簡単に変更できるため、無視するようにアプリケーションを設計する必要があります。 それは現在のシステム時刻を読むときに `DateTime.UtcNow`を使うことを意味します。 あるいは、 `DateTimeOffset`を DateTimeOffset.Now`または `DateTimeOffset.UtcNow`プロパティと共に使用することもできます。

http://codeofmatt.com/2013/04/25/the-case-against-datetime-now/ [DateTimeに対する訴訟]も参照してください。

特定のユーザーの現地時間で作業する必要がある場合は、そうです - 使用方法ごとに変換を行う必要があります。 これを達成するために `TimeZoneInfo`クラスを使うことができます。

また、http://en.wikipedia.org/wiki/Tz_database [IANAタイムゾーンデータベース]の実装を提供するhttp://nodatime.org [Noda Time]の使用を検討することもできます。一般的な。