2010-12-06 19 views

答えて

2

また、What every developer should know about time(これは参照されているスクリーンショットを含む)で回答されています。

今日は夏時間が終わると、これは投稿のための楽しい時間だと思いました。どのように時間を扱うかは、それを間違ってしまうのは簡単ではありません。

まず、UTC(グリニッジ標準時とも呼ばれます)を使用することは、正しい解決策ではないことが多いです。しかし、多くのプログラマーは、すべての方法でそれらを保存すれば、それをカバーすると思っています。 (このミスは、議会が米国でDSTの開始を変更した数年前のことです。なぜなら、再発するイベントを調整するためにOutlook上で修正プログラムを実行しなければならないからです)。

ここで重要な質問から始めましょう時間どおりに?ユーザーが午前7時に何かを実行したいと言ったら、どういう意味ですか?ほとんどの場合、その場所は午前7時を意味しますが、必ずしもそうとは限りません。場合によっては、Webサーバーの統計情報を正確に比較するために、DSTに対して調整されていない各「日」を同時に終了させたい場合があります。もう一方の側では、ある日に薬を飲んでカレンダーにセットしている人は、いつも現地時間にしたいと思うので、午後3時のイベントは午前3時ではないので、世界。

だから私たちはここに三つの主要なユースケース(そこにいくつか他の人がいるが、彼らは一般的に次のようで扱うことができます)があります。

1.同じ絶対(もっと良い言葉の欠如のために)時間を。

2. DSTがオン/オフになるときにシフトする、ある時間帯の時間(一部の地域で発生する2回のDSTを含む)。

3.現地時間。

最初は扱いが簡単です - あなたはUTCとして設定します。このようにすることで、毎年24時間の時間がかかります。 (興味深いことに、UTCは標準時のグリニッジ標準時刻と一致しています.DSTの場合、グリニッジとUTCは同じではありません)。

2番目に時刻とタイムゾーンを格納する必要があります。ただし、タイムゾーンは現在のオフセットではなく、地理的なゾーンです(オフセットはUTCとの差です)。つまり、「Mountain Standard Time」や「Mountain Daylight Savings Time」ではなく「Mountain Time」を保存します。したがって、「山岳時間」の午前7時は、年中無休のコロラドで午前7時になります。

第3のタイムゾーンは、「Local Time」と呼ばれるタイムゾーンを持つ点で2番目のタイムゾーンと似ています。ただし、発生するタイミングを判断するには、そのタイムゾーンを知る必要があります。

Outlookにこれを処理する手段が追加されました。タイムゾーンのボタンをクリックします:

をそして、あなたは今、各イベントのタイムゾーンを設定することができます

私は私の飛行時間1ゾーンに出発し、別に到着含めて、私はこれを使用して出張を持っている場合。 Outlookはすべてをローカルタイムゾーンに表示し、その変更がいつ調整されます。もう一方のiPhoneはこれが起こっているとは考えていないし、別のタイムゾーンにいる旅行中にはすべてがオフになっている(コロラドに住んでいるときはほとんどすべての旅行が別のタイムゾーンにある)。

それは

は、[OK]を、ので、どのようにあなたがこれを処理します使用するために置きますか?実際にはかなり簡単です。毎回次の2つの方法のいずれかを保存する必要があります。012A UTC。一般的には、UTCとして保存されても、現地時間に設定/表示されます。

2. datetimeと地理的タイムゾーン(「ローカルタイム」も可能)。

ここでは、使い方を知っています。ここにいくつかの一般的な規則があります。追加のユースケースについてはこれを把握する必要がありますが、ほとんどの場合、これらのカテゴリに該当します。

1.何かが起こったとき - UTC。これは単発的なイベントであり、ユーザーがどのように表示したいかに関係なく、発生したタイミングは変更できません。

2.ユーザーがUTC-UTCのタイムゾーンを選択したとき。

3.将来、ユーザーがtimezone - datetimeとtimezoneで発生することを望むイベント。次の数ヶ月でUTCを使用するのが安全な場合があります(タイムゾーンの変更は一般的に警告が多々ありますが、時にはわずか8日ですが)、ある時点でこれを行う必要があるので、実行する必要がありますすべての場合に適用されます。この場合、保存したものが表示されます。

4.スケジュールされたイベントの場合は、次のイベントが発生する予定 - UTC。これは、ランタイムが今までのすべての「次のイベント」を取得できるようにするためのパフォーマンス要件です。それぞれを再計算するよりも日付に対して検索するほうがはるかに高速です。ただし、四半期ごとに実行されるイベントのルールが変更された場合は、スケジュールされたすべてのイベントを定期的に再計算する必要があります。

1.「現地時間」のイベントの場合、ユーザーのタイムゾーンが変更されるたびに再計算が行われます。また、変更でイベントがスキップされた場合は、直ちにイベントが発生する必要があります。

1.Create日時を任意のタイムゾーンで:.NETの中

.NETのDateTime

ダイビングは、これは我々が標準ライブラリが提供していない二つのことを得ることができるようにする必要があることを意味します(DateTimeはローカルのタイムゾーンとUTCのみをサポートしています)。

2.指定された日付、時間、および地理的タイムゾーンについては、UTC時間を取得します。その日のそのゾーンのDSTルールに基づいて調整する必要があります。

幸い、これには解決策があります。私たちは、DateTimeタイムゾーンの機能拡張をオープンソース化しています。ここでWindwardTimeZoneをダウンロードできます。これは、Windowsのレジストリ設定を使用して各ゾーンのすべての計算を実行するため、最新の状態を維持する必要があります。

ブラウザの痛み

我々は考え出したていない一つのことは、彼らは私たちのWebアプリケーションをヒットするブラウザを使用している場合は、ユーザの位置を知る方法です。ほとんどの国では、ロケールを使用してタイムゾーンを決定できますが、米国(6ゾーン)、カナダ、ロシア(11ゾーン)では使用できません。だから、あなたは自分のタイムゾーンを設定し、旅行時にそれを変更するようにユーザーに頼む必要があります。誰かがこれに対する解決策を知っているなら、私に知らせてください。

アップデート:私はジャスティン・ボナー(ありがとう)から次のことを受け取っ:。。

のdocument.getElementById( 'timezone_offset')値=新しいDate()と、GetTimezoneOffset();

これを使用して、下記のIPアドレスのジオロケーションの提案を閉じることができます。しかし、それは100%ではありません。時間オフセットは、例えば、アリゾナ州(&ハワイで夏時間を観測していない)と太平洋/マウンテン(DSTによる)の時間帯の場合などには表示されません。あなたはまた、JavaScriptがオンになっていることに依存していますが、今日のユーザーの99%はそうです。

IPアドレスに基づくジオロケーションもiffyです。私はデモダウンロードフォームに問題があるという報告があったとき、私はD.C.のホテルにいました。 IPアドレスのジオに基づいて、市、州、&国にフォームをあらかじめ入力します。私はオハイオ州クリーブランドにいると言った。だからもう一度、通常は必ずしもそうではありません。

私はtakeを使うことができます。そのオフセットを持つ複数のタイムゾーンがある場合(その日に)、IPアドレスのジオをフォローアップしてください。しかし、私は確かに、HTMLリクエストで送信されたヘッダー情報にtz =を追加することを望みます。

+1

.NET 2.0以降で使用されていたDateTimeOffset(http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx)を含めるように記事を更新する必要があります。 – Gabe

関連する問題