2012-01-03 10 views
7

私は、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"オプション)。その解決策は、ユーザープロファイルの一部としてタイムゾーンのオフセットを保存することができますが、それは簡単ではないかもしれません(セッション間の夏時間の切り替え)。

この問題の包括的な解決策があり、うまく機能し、たくさんのコードを書く必要はありませんか?私は非常に不思議です、助言してください。

答えて

4

あなたは、ISO8601など、標準的な形式でクライアントに時刻文字列を渡す必要があります。

var timeString = '2012-01-02T16:00:00Z'; 

一部のブラウザでは正常にISO8601文字列を解析し、いくつかの文句を言わないので、確かにそれを手動で解析します。これはかなり簡単な作成し、ローカルの日付オブジェクトはその後、UTCの日付と時刻を設定している:

function localDateFromUTC(s) { 

    var x = s.split(/[-\s:tz]/i); 
    var d = new Date(); 

    d.setUTCFullYear(x[0], x[1], x[2]); 
    d.setUTCHours(x[3], x[4], x[5]); 
    return d; 
} 

var s = '2012-01-02T16:00:00Z'; 
var d = localDateFromUTC(s); 
alert(d); // Shows local date and time for the provided UTC date and time 

あなたが特定の出力をしたい場合は、手動でフォーマットする必要があり、例えば

function formatDate(d) { 
    var days = ['Sunday','Monday','Tuesday','Wednesday', 
       'Thursday','Friday','Saturday']; 
    var months = ['January','February','March','April','May','June','July', 
       'August','September','October','November','December']; 

    return days[d.getDay()] + ', ' + d.getDate() + ' ' + 
       months[d.getMonth()] + ', ' + d.getFullYear(); 
} 

ほとんどはとにかくローカル設定を無視するように見える、あなたはのtoLocaleString()を使用して試すことができますが、結果はブラウザ間で大きく異なります。

+0

_特定の出力が必要な場合_ 私はこのような日付を渡す考えが好きですが、ローカルの日付/時刻形式を決定する問題は解決していません。'' 01/02/2012 2:00 PM'''、 '' 2012-01-02 14.00''、おそらく ''02 .01.2012 14:00''の使い方をどうやって知っていますか? –

+0

通常の解決方法は、「2 February、2012」のような明瞭な形式で書くことです。他の形式で日付を好んでも、誰にでも明確に理解されるはずです。ブラウザがまともな* toLocaleString *を持っていればそれを使うことができますが、そうではありません。 – RobG

+1

gmailがタイムゾーンをどのように処理するかをリバースエンジニアリングしようとしました。確かに賢いです。サーバー上で日付の書式設定とタイムゾーン変換を行います。顧客は、2010年1月1日から2010年6月30日まで、そして6月30日と1月1日の間にバイナリ検索を実行することによって、夏時間スイッチ(存在する場合)の日付を決定しようとします。これらの情報は、ゾーンオフセット、文字列で(私の手を見て!) '(新しい画像).src = encoded_string'!これにより、メインページがクッキーまたはポストバックなしでレンダリングを完了する前に、データをサーバーに渡すことができます。 –

関連する問題