私は、ASP.NETアプリケーションとサーバー上のUTCタイムスタンプを持っています。タイムスタンプをユーザに適切なタイムゾーンで表示し、ローカル日付/時刻フォーマットを使用したいとします。ASP.NETを使用してWebユーザに地域別の日時情報を表示する方法
など。 Jan 2, 2012 14:00:00 UTC
は、ニューヨーク、米国(UTC -0500)のユーザーには1/2/2012 9:00 AM
と表示され、英国のユーザーには02/01/2012 14:00
と表示されます。
このシンプルな作業は驚くほど難しいことが判明しました。 MSDN has an articleと同じタイトルですが、サーバー側のデータを表示するのではなくユーザーの入力を解析するため、完全には適用されません。
タイムゾーンオフセットを簡単に
は、JavaScript
offset = new Date().getTimezoneOffset();
を介してクライアント上で決定されるが、JavaScriptは、日付/時刻の書式設定に非常に悪いのサポートを提供します。あなたが得るのはtoLocaleString()
メソッドです。その結果、Monday, January 02, 2012 9:00:00 AM
のような醜い長い文字列になります。より短いフォーマットのための規定はないので、クライアントでは、良いタイムゾーン情報と悪い日付/時刻フォーマット機能が残っています。
状況はサーバー上で正反対です。当社は、ユーザーのロケール(not the best choice, but may be good enough)を取得するには、Accept-Language HTTPヘッダーを活用し、我々のコードは
CultureInfo userCulture = new CultureInfo(Request.UserLanguages[0]);
のラインプラスいくつかのエラー処理に沿って行くので、その後、既知のロケールの.NETデータベースを活用することができます。
しかし、私たちはタイムゾーンの問題に固執しています。はい、JavaScriptで取得し、Cookieやポストバックデータとして渡すことはできますが、アプリケーションの最初のページに日付を表示する必要がある場合はどうすればよいですか?最初のページは常にログインページであると主張するかもしれませんが、ユーザーのログイン情報がセッション間で保持されている場合はそうではありません( "remember me"オプション)。その解決策は、ユーザープロファイルの一部としてタイムゾーンのオフセットを保存することができますが、それは簡単ではないかもしれません(セッション間の夏時間の切り替え)。
この問題の包括的な解決策があり、うまく機能し、たくさんのコードを書く必要はありませんか?私は非常に不思議です、助言してください。
_特定の出力が必要な場合_ 私はこのような日付を渡す考えが好きですが、ローカルの日付/時刻形式を決定する問題は解決していません。'' 01/02/2012 2:00 PM'''、 '' 2012-01-02 14.00''、おそらく ''02 .01.2012 14:00''の使い方をどうやって知っていますか? –
通常の解決方法は、「2 February、2012」のような明瞭な形式で書くことです。他の形式で日付を好んでも、誰にでも明確に理解されるはずです。ブラウザがまともな* toLocaleString *を持っていればそれを使うことができますが、そうではありません。 – RobG
gmailがタイムゾーンをどのように処理するかをリバースエンジニアリングしようとしました。確かに賢いです。サーバー上で日付の書式設定とタイムゾーン変換を行います。顧客は、2010年1月1日から2010年6月30日まで、そして6月30日と1月1日の間にバイナリ検索を実行することによって、夏時間スイッチ(存在する場合)の日付を決定しようとします。これらの情報は、ゾーンオフセット、文字列で(私の手を見て!) '(新しい画像).src = encoded_string'!これにより、メインページがクッキーまたはポストバックなしでレンダリングを完了する前に、データをサーバーに渡すことができます。 –