質問

すべてを GMT で保存しますか?

埋め込みオフセットを使用して、入力されたとおりにすべてを保存しますか?

レンダリングするたびに計算を行いますか?

相対時刻「1分前」を表示しますか?

役に立ちましたか?

解決

UTC で保存する必要があります。そうしないと、夏時間などの期間中の履歴レポートと動作が失われます...面白い。GMT は現地時間であり、UTC を基準とした夏時間の対象となります (UTC は異なります)。

現地時間を保存している場合、異なるタイムゾーンのユーザーにプレゼンテーションを行うのは非常に厄介です。生データが UTC である場合、ローカルに調整するのは簡単です。ユーザーのオフセットを追加するだけで完了です。

ジョエルはポッドキャストの 1 つでこのことについて (遠回しに) 話しました。彼はこう言いました。 データを可能な限り最高の解像度で保存する (「忠実度」で検索してください)、再び消えたときにいつでも変更できるからです。これが、UTC として保存すると言っている理由です。そのタイムゾーンにいない人に合わせて現地時間を調整する必要があり、それは大変な作業です。また、たとえば、時刻を保存したときに夏時間が有効であったかどうかを保存する必要があります。ゆーく。

これまでデータベースには、ソート用の UTC と表示用の現地時間の 2 つを保存することがよくありました。そうすれば、ユーザーもコンピュータも混乱することはありません。

さて、表示に関しては次のようになります。もちろん、「3 分前」を実行することはできますが、UTC を保存した場合に限ります。そうでない場合、異なるタイムゾーンで入力されたデータが「-4 時間前」と表示されるなどの動作が行われるため、人々はびっくりするでしょう。実際の時間を表示する場合、人々は現地時間で表示することを好みます。データが複数のタイムゾーンで入力されている場合、UTC を保存している場合にのみそれを簡単に行うことができます。

他のヒント

いつものように、答えは「場合による」です。

それは、時間について何を説明しているのか、またデータがどのように提供されたのかによって異なります。時間値を保存する方法を決定する鍵は、タイムゾーンを削除することで情報が失われるかどうか、またユーザーを驚かせないかどうかを判断することです。

データを UTC time_t で保存することには明らかな利点があります。これは単一の int であるため、迅速な並べ替えと簡単な保存が可能になります。

この問題は特定の領域に分類されると考えられます。

  1. 歴史的なデータ
  2. 将来の短期データ
  3. 将来の長期データ

それぞれに次のサブクラスがあります。

  1. 提供されるシステム
  2. ユーザー提供

一つずつ見ていきましょう。

提供されるシステム:システムを UTC で実行することをお勧めします。そうすればタイムゾーンの問題が回避され、やはり情報の損失は見られません (常に UTC です)。

歴史的なデータ:これらは、システム ログ ファイル、プロセス統計、トレース、コメント日時などです。データは変更されず、タイムゾーン記述子も遡って変更されることはありません。このタイプのデータの場合、提供されたタイムゾーンに関係なく、情報を UTC で保存することで情報が失われることはありません。したがって、タイムゾーンを削除します。

将来の長期データ:これらは、かなり遠い将来に起こる出来事、または今後も起こり続ける出来事です。タイムゾーン記述子が十分に長く保持される場合、タイムゾーン記述子は変更されることが保証されます。このタイプのデータの好例は、「毎週の経営会議」です。これは一度入力されるデータであり、永続的に機能し続けることが期待されます。これらの値については、システムが提供するのかユーザーが提供するのかを判断することが重要です。ユーザーが提供したデータの場合、時刻は作成者のタイムゾーンで保存される必要があり、それ以外の場合は情報が失われます。この情報の損失は、タイムゾーンの定義が変更され、作成者に時刻がまったく異なる値として表示される場合に明らかになります。

Bwooce 氏が指摘したように、作成者と視聴者が異なるタイムゾーンにいる場合、多少の混乱が生じます。その場合、アプリケーションは、以前の場所からのタイムゾーンのシフトによりどの時間値が移動したかを示すことを期待します。

将来の短期データ:これは、すぐに履歴データになるデータ、または短期間しか有効でないデータです。例としては、インターバル タイマー、評価の移行などが挙げられます。このデータの場合、値が作成されてから履歴になるまでに定義が変更される可能性は低いため、タイムゾーンを削除しても回避できる可能性があります。しかし、これらの値には「将来の長期データ」になるという悪い癖があることがわかりました。

タイムゾーンを保存することを決定したら、その保存方法に注意する必要があります。

  • タイムゾーンをオフセットまたは完全な記述子として保存しないでください。

タイムゾーンをオフセットとして保存した場合、タイムゾーンが変更された場合はどうすればよいでしょうか?システムを調べて、既存のデータを全面的に変更しますか?そうすると、過去の値が間違ったことになります。この障害の良い例は、Oracle と iCal です。Oracle はタイムゾーン情報を UTC からのオフセットとして保存し、iCal には作成タイムゾーンの完全な記述子が含まれます。

  • 名前として保存してください。

これにより、既存の値を変更せずにタイムゾーンの定義を変更できるようになります。タイムゾーン データが変更されると、生成されたインデックスが無効になる可能性があるため、並べ替えがより困難になります。

開発者がタイムゾーンに関係なくすべてを UTC で保存し続けると、タイムゾーン変更の最後のバッチで発生した問題が引き続き発生することになります。

ある組織では、秘書は夏時間開始日の前にチームのカレンダーを印刷し、変更後に再度印刷する必要がありました。最後に、2 つを比較し、移動したすべての予定を再作成しました。もちろん、何回かは見逃したので、古い夏時間の日付に達して時刻が再び正しくなるまで、数週間の苦しみがありました。

Josh の指摘は完全に正しいですが、微妙な注意点が 1 つあります。これは、将来のイベントやタイムゾーンに関して正解のないケースです。

繰り返しの予定の場合を考えてみましょう。これは GMT 0000 (簡単にするため) に発生します。これは、オーストラリアのシドニーでは 1200 NZST (ニュージーランド標準時) および 1000 AEST です。

あるゾーンで夏時間が有効になった場合、予定はどうなるでしょうか?そうすべきだ:

1a.TZの変更が任命の「所有者」(誰が予約したか)のゾーンにある場合、同じ机の時刻時刻(午前10時)にとどまることを試みますか?
1b.TZの変更が他の会議参加者のゾーンの1つにある場合、変更はありません

結果:所有者のTZの変更により、予想外に他のすべての人のために動きますが、所有者に関する限り「午前10時の会議」を維持します。

'2.上記と同じですが、逆になります。

結果:会議のオーナーにとっては (午前 10 時の会議が午前 9 時の会議になる、つまり v/v)、予想されているかもしれませんが、不便です。他の出席者は、自分の TZ 移行が完了するまで、同じデスク クロック タイムのままになります。

どちらも完璧ではありません。2 つの予約がある場合を考えてみましょう。1 つは現地時間の午前 10 時に個人 A によって予約され、もう 1 つは午前 9 時に個人 A を出席者として個人 B によって予約されました。ユーザー A とユーザー B が異なる TZ にいる場合、DST の変更により簡単にダブルブッキングが発生する可能性があります。

この時点であなたの心が少し曲がっているなら、それはよくわかります。

この例の背後にある重要な点は、これらの動作のいずれかを適切に実行するには、現地時間の UTC バージョンだけでなく、所有者が予約したときにいた TZ (オフセットではなく) も知る必要があるということです。それ以外の場合は、グリニッジ標準時は変更されず、プレゼンテーションのみが変更されるため、状況が変更されたことを誰にも通知せずに、黙ってオプション 2 を選択するしかありません...よね?(いいえ、これは罠です。午前 10 時の会議が勝手に進んでしまうと、プレゼンテーションが重要になります)

この洞察力は同僚であり友人であるジェイソン・ポロックの功績だと言わざるを得ません。読む ここでの彼の見解, 、そしてその後の議論 iCal と VTIMEZONE ここ。

すべてを GMT/UTC で保存するのが最も合理的だと私には思えます。その後、必要なすべてのタイムゾーンで日付と時刻を表示できます。

いくつかの注意点:

  1. 時間が壁の時計時間としてのみ指定され、それが主要な表現である場合、それは完全に指定された時間ではありません。GMT表現で変換する必要があります(そしてできません)。例えば。毎朝午前9時。言い換えると:これは(日付)時間ではありません。
  2. 将来の予約の日時を節約する場合は、入力タイムゾーンと 瞬間自体. 。だからそれが冬に作られた夏の予定である場合西ヨーロッパ、それは+2:00、通常は通常(冬の時間)オフセットは+1:00です。これにより、Bwooceが言及したCalenderの問題が解決します。
  3. もちろん、GMTへの変換中に正しいオフセットを使用することに当てはまることは、特定のタイムゾーンの日時に変換するときに適用されます。

幸いなことに、正しく使用すると、(.NET) DateTime 型がカレンダーの保持などの悲惨な詳細をすべて処理します。あなたにとって、仕組みがわかれば、これらすべては非常に簡単になるはずです。

個人的には、すべてを GMT で保存し、ユーザーのローカル タイムゾーンを使用して、ユーザーに関連する時間を表示しない理由が見当たりません。

相対時間を表示したい場合は、明らかに時間が必要であり、翻訳を行う必要がありますが、翻訳を行いたい場合は、やはり GMT が最良の選択肢だと思います。

そこで、MSSQL サーバーを使用してちょっとした実験を実行しました。

テーブルを作成し、現在のローカライズされたタイムゾーン (オーストラリア) を示す行を追加しました。次に、日時を GMT に変更し、別の行を追加しました。

これらの行は約 10 秒の間隔で追加されたとしても、SQL Server では 10 時間の間隔があるものとして表示されます。

少なくとも、日付を一貫した方法で保存する必要があることがわかります。これは、私にとって、日付を GMT として保存するという議論に重みを加えます。

MS Dynamics は GMT を保存し、ユーザー レベルで GMT を基準としたタイム ゾーンを認識します。その後、あなたのタイムゾーンでアイテムが表示されます。

それはMSのかなり大きなグループであり、これが彼らがそれを処理する方法を決定したので、私はそれをそこに投げようと思った。

私はすべてをタイムゾーンとともに保存することを好みます。どちらの方法で後で表示するかをクライアントが決定できます。私のお気に入りの変換ライブラリは PostgreSQL データベース.

ここを見てください。w3c は質問に見事に答えています。

ユースケースを見てください。

http://www.w3.org/TR/timezone/

日付時刻を GMT ではなく UTC として保存することを推奨していることに注意してください。GMT は夏時間の対象となります。

私は GMT で保存し、相対的なもの (「約 10 秒前」、「5 か月前」) のみを表示するのが好きです。ほとんどのユースケースでは、ユーザーは実際のタイムスタンプを確認する必要はありません。

確かに例外はあり、個々のアプリケーションには例外が多数ある可能性があるため、「唯一の唯一の方法」という答えはあり得ません。強力な監査能力が必要なもの(例:投票など)、時間が議論の領域(天文学、科学研究)の一部であるシステムでは、ユーザーに真のタイムスタンプを表示することが要求される場合があります。

ただし、ほとんどのアプリは、単純な相対時間の方が理解しやすいです。

私は通常 Unix 時間を使用します。必ずしも将来的に安全であるとは限りませんが、かなりうまく機能します。

常に GMT (または UTC) で保存します。そこから、任意のローカル タイム ゾーン値に簡単に変換できます。

日付は、ユーザーが提供したデータでない限り、UTC として保存する必要があり、ユーザーがそのデータを意図したタイムゾーンを知ることはできません。場合によっては (非常にまれですが)、タイムゾーンを指定せずに、時、分、秒、日、月、年のコンポーネントだけを保存して、ユーザーに吐き出すことができるようにする必要があります。新しい開発者向け、または自信がない場合は、UTC を保存すれば 99% 正確です。

ただし、これが常にすべてのケースで 100% うまくいくと信じて騙されないでください。そうではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top