アプリケーションを使用しているユーザーとは異なるタイムゾーンでホストされている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に保存され、簡単に取得できます。
ModelBinder
。