SQL データベースに utc 形式で保存された時刻があります。それらの時刻をグリッドビューに表示していますが、まだ UTC 形式です。それらをクライアントのブラウザの現地時間に変換したいと思います。問題は、現在の日付/時刻のみのタイムゾーン オフセットを取得できることです。将来のこれらの日付の一部が夏時間中に発生する場合、そのオフセットは変更される可能性があります。私は Web プログラミングに比較的慣れていませんが、各エントリが C# の datetimeoffset オブジェクトを取得して現地時間に変換する gridview にバインドされるため、Javascript を実行する必要があるようです。それともそれは不可能ですか?
3 に答える
オブジェクトがある場合、これはサーバー側で実行できTimeZoneInfo
ます。静的ConvertTimeFromUtc()
メソッドを使用できます。
C# の場合:
DateTime localTime = TimeZoneInfo.ConvertTimeFromUtc(myDbDateTime, myTimeZoneInfo);
サーバー側にタイムゾーンがない場合、javascript はクライアントのタイムゾーンを提供しないため、注意が必要です (クライアントが米国にいる場合を除き、一部のブラウザーのみ)。この場合、ユーザーに現在のタイムゾーンを強制的に選択させ、それをアカウントに保存させるのが最善の方法です。これが匿名ユーザーに表示されている場合は、おそらくデフォルトで UTC で表示し、選択したタイムゾーンで更新するオプションを提供する必要があります。
アップデート
ユーザーのタイムゾーンを自動的に決定しようとすると、いくつかの問題が発生します。
- タイムゾーンは、ユーザー エージェントによってサーバーに提供されません。
- Javascript はタイムゾーンへのアクセスを提供しません (一部のブラウザーを除きます)。
JavaScript 関数getTimezoneOffset()
は最初は良いアイデアのように聞こえるかもしれませんが、同じオフセットを持つタイムゾーンが複数あるため、これは一意の値ではありません。これらの非固有ゾーンの多くの違いは、夏時間の実装です。
例: インディアナ州は DST を考慮しません。したがって、年の半分はオフセットが東部時間に一致し、残りの半分はオフセットが中部時間に等しくなります。
ただし、ユーザー ベースが主に米国にあり、IE、Chrome、Safari、または Firefox を使用しているtoString()
場合は、オブジェクトのメソッドを使用しDate
てタイムゾーンを取得できます。これらのブラウザは、さまざまな方法でタイムゾーンを日付文字列に追加します。米国外では、タイムゾーンはすべてのブラウザーに含まれているわけではありません (一部のブラウザーではまだ表示される場合があります)。
http://jsbin.com/onulo3を開いて観察してください:
IE8: Sun Feb 14 22:12:22 EST 2010
Chrome: Sun Feb 14 2010 22:12:22 GMT-0500 (Eastern Standard Time)
Safari: Sun Feb 14 2010 22:12:22 GMT-0500 (東部標準時)
Firefox: 2010 年 2 月 14 日 22:12:22 GMT-0500 (東部標準時)
いくつかの解析により、アメリカのすべてのユーザーのタイムゾーンを特定できるようになりました。それ以外の場合は、時刻を UTC で表示できます (その旨の通知付き)。
"Indiana Daylight Savings Time" で次の情報を見つけました: http://www.timetemperature.com/tzus/indiana_time_zone.shtml
2010 年 1 月 18 日現在、Microsoft システム ライブラリの呼び出し TimeZoneInfo.ConvertTimeFromUtc がこの動作を反映しているようです。
変換する方法は 2 つあります。
方法 #1: 日時がエポック秒形式の場合は、次のようなものを使用します。
var d=new Date(seconds_since_epoch);
document.write(d.toString());
方法 #2: UTC 時間で年、月、日、時、分、秒しかない場合は、次を使用します。
var d=new Date(yyyy,mo-1,dd,hh,mi,ss); // in JavaScript, January is month 0
document.write(d.toString());