ASP.NET でアプリケーションのタイムゾーンを定義して、現在のサーバー時刻から読み取った/現在のサーバー時刻と比較したすべての時刻が暗黙的に変換されるようにする方法はありますか?それとも、DateTime.Now 呼び出しごとに変換ステートメントを挿入する必要がありますか?
3 に答える
ASPの最新の進化についてはよくわかりませんが、2006年のこの記事は興味深い答えを提供しています。
問題は、タイムゾーン情報がWebブラウザから直接利用できないことです。ヒューリスティックを使用して正しいタイムゾーンを決定するか、ユーザーの選択に基づいてユーザーのタイムゾーン設定を保存する必要があります。
以下は、.Net 3.5とそのTimeZoneInfo..ConvertTimeメソッドでは必要ない場合がありますが、完全を期すために、次のようにします。
タイムゾーンの設定が完了したら、時間を変換する必要があります。日付/時刻の値は常にUTCのDBに保存する必要があります。これにより、多くの変換の問題が解消されます。情報をUTCで保存する場合は、データを表示するときにUTCからユーザーのローカルタイムゾーンに変換するだけで済み、日付/時刻の値を取得するときにタイムゾーンからUTCに変換する必要があります。
これをさらに難しくしているのは、TimeZoneクラスがそれほど有用ではないという事実です。幸い、v2.0では、時刻がUTCであるかどうかのインジケーターをサポートするようにDateTimeが更新されました。 DateTime.ToUniversalTimeメソッドを使用して、DateTimeをUTCに変換できます。残念ながら、それを元に戻すことはできません。
ToLocalTimeメソッドはローカルタイムゾーンを使用します。ローカルタイムゾーンは、サーバー上で実行されると、サーバーのタイムゾーンを使用しますが、これは目的のタイムゾーンではありません。ただし、さらに悪いことに、TimeZoneオブジェクトを単純に作成して、そのサポートが存在しないために使用することはできません。
Michael Brummは、タイムゾーンを簡単に作成して使用できるようにするための素敵な小さなクラスを作成しました。私は自分のアプリでそのコードの大幅に変更されたバージョンを個人的に使用しており、それはうまく機能します。DBUTC値からローカルユーザーのタイムゾーンに変換する手順は次のとおりです。
1)ユーザーの保存されたタイムゾーン値を取得します
2)それをラップするSimpleTimeZoneクラスを作成します(DB値を基になるWindowsレジストリバージョンにマップするマッピングスキームを使用します)
3)SimpleTimeZone.ToLocalTimeメソッドを使用してDateTime値をに変換します現地時間。
パフォーマンス上の理由から、SimpleTimeZoneインスタンスを取得して初期化し、リクエストの長さだけItemsプロパティにキャッシュして、作成を続ける必要がないようにする必要があります。
ユーザーのローカルタイムゾーンからUTCに変換するには、逆の操作を行います。
1)ユーザーから保存されたタイムゾーン値を取得します
。2)それをラップするSimpleTimeZoneクラスを作成します
。3)SimpleTimeZone.ToUniversalTimeメソッドを使用してDateTimeをUTCに変換します。
内部的にDateTime.UtcNowを使用します。.NET 3.5の場合は、 TimeZoneInfo.ConvertTimeを確認してください。
この質問に直接答えさせてください。
ASP.NET でアプリケーションのタイムゾーンを定義して、現在のサーバー時間から読み取った/現在のサーバー時間と比較したすべての時間が暗黙的に変換されるようにする方法はありますか?
いいえ、これは不可能です。.NET には、スレッドごとまたはアプリケーションごとにローカル タイム ゾーンを変更するメカニズムはありません。コードが実行されているマシンのタイムゾーン設定によってのみ、システム全体で変更できます。 この回答も参照してください。
...または、DateTime.Now 呼び出しごとに変換ステートメントを挿入する必要がありますか?
DateTime.Now
Web アプリケーションでは使用しないでください。サーバーのタイム ゾーン設定は簡単に変更できるため、それを無視するようにアプリケーションを設計する必要があります。つまりDateTime.UtcNow
、現在のシステム時刻を読み取るときに使用します。DateTimeOffset
または、そのDateTimeOffset.Now
またはDateTimeOffset.UtcNow
プロパティで使用できます。
特定のユーザーの現地時間で作業する必要がある場合は、そうです。使用するたびに変換を行う必要があります。TimeZoneInfo
クラスを使用してこれを実現できます。
また、 IANA タイム ゾーン データベースの実装を提供するNoda Timeの使用を検討することもできます。これは、一般的にはるかに優れた API です。