タイムゾーンをエレガントに扱う方法
アプリケーションを使用しているユーザーとは異なるタイムゾーンでホストされているWebサイトがあります。これに加えて、ユーザーは特定のタイムゾーンを持つことができます。他のSOユーザーとアプリケーションがこれにどのように取り組むかと思っていましたか?最も明白な部分は、DB内で日付/時刻がUTCに格納されることです。サーバー上では、すべての日付/時刻はUTCで処理する必要があります。しかし、私が克服しようとしている3つの問題を見つけました。 UTCでの現在の時刻の取得(で簡単に解決DateTime.UtcNow)。 データベースから日付/時刻を取得し、ユーザーに表示します。さまざまなビューで日付を印刷する呼び出しが潜在的にたくさんあります。この問題を解決できるビューとコントローラーの間にあるレイヤーを考えていました。または、カスタム拡張メソッドをオンにしますDateTime(以下を参照)。主な欠点は、ビューで日時を使用するすべての場所で、拡張メソッドを呼び出す必要があることです。 これにより、のようなものを使用するのも難しくなりJsonResultます。あなたはもはや簡単に呼び出すことができませんでしたJson(myEnumerable)、それはそうでなければなりませんJson(myEnumerable.Select(transformAllDates))。たぶん、AutoMapperはこの状況で役に立ちますか? ユーザーからの入力の取得(ローカルからUTC)。たとえば、日付を含むフォームをPOSTするには、日付を以前にUTCに変換する必要があります。最初に頭に浮かぶのは、カスタムの作成ModelBinderです。 以下は、ビューで使用することを考えた拡張機能です。 public static class DateTimeExtensions { public static DateTime UtcToLocal(this DateTime source, TimeZoneInfo localTimeZone) { return TimeZoneInfo.ConvertTimeFromUtc(source, localTimeZone); } public static DateTime LocalToUtc(this DateTime source, TimeZoneInfo localTimeZone) { source = DateTime.SpecifyKind(source, DateTimeKind.Unspecified); return TimeZoneInfo.ConvertTimeToUtc(source, localTimeZone); } } サーバーのローカル時刻が予想されるタイムゾーンと大きく異なる可能性がある多くのアプリケーションがクラウドベースになっていることを考えると、タイムゾーンの処理は非常に一般的なことだと思います。 これは以前にエレガントに解決されましたか?私が見逃しているものはありますか?アイデアや考えは大歓迎です。 編集:混乱を解消するために、もう少し詳細を追加すると思いました。問題は、今ではありませんどのようにそれがよりUTC->ローカルおよびローカルから> UTCから行くのプロセスについてです、デシベルでUTC時刻を格納します。@Max Zerbiniが指摘するように、ビューにUTC-> Localコードを配置するのは明らかに賢明ですが、DateTimeExtensions実際に答えを使用していますか?ユーザーから入力を受け取るとき、日付をユーザーのローカル時間として受け入れ(JSが使用しているModelBinderため)、それを使用してUTCに変換することは理にかなっていますか?ユーザーのタイムゾーンはDBに保存され、簡単に取得できます。