2

以前にも同様のトピックがあります:夏時間とタイムゾーンのベストプラクティス

私が尋ねようとしていることは関連していますが、異なります。

日付処理の推奨プラクティスは何ですか?

もっと「論理的な」日付を探しています。たとえば、アプリケーションの営業日、または特定の人の生年月日です。

通常、私はそれを日付(Oracleの場合)として0:0:0の時間で保存します。アプリケーションのすべてのコンポーネントが同じタイムゾーンにある場合、これは正常に機能します。DB内のその日付はDBのタイムゾーンの0:0:0を意味します。別のタイムゾーンのユーザーにデータを提示している場合、たとえば、日付2012-12-25 0:0:0であるため、問題が発生しやすくなります。ロンドン時間は実際には2012-12-2416:0:0香港時間です。

私は2つの解決方法を考えましたが、どちらにも欠点があります。

まず、文字列として保存します。欠点は明らかです。アプリやクエリで多くの会話を行う必要があり、日付の計算が多く失われました。

2番目の方法は、日付として保存することですが、事前定義されたタイムゾーン(UTCなど)を使用します。アプリケーションが日付を表示しているときは、UTCタイムゾーンとして表示する必要があります。ただし、アプリケーションコードで多くのタイムゾーン操作が必要になります。

日付を処理するための推奨される方法は何ですか?または、ほとんどの人は、上記の3つのアプローチ(同じタイムゾーンであると想定するものを含む)のいずれかを使用するだけですか?

4

3 に答える 3

2

日付は日を識別する方法であり、日はローカルタイムゾーン、つまり太陽を基準にしています。1日は24時間です(うるう秒やその他の恒星時の修正のためですが、その24時間は非常に近い近似値にすぎません)。したがって、ロンドンの12月5日の日付は、ニューヨークの12月5日の日付とは異なる24時間の期間を示します。この結果の1つは、異なるタイムゾーン間の日付で算術演算を実行する場合、精度は+/- 1までしか実行できないことです。データ構造として、これは従来の日付(たとえば、年と日オフセット)およびUTCからの1時間オフセットによって識別されるタイムゾーン(注意してください、そこには約30分オフセットがあります)。

あるタイムゾーンの日付を別のタイムゾーンの日付に変換することは、異なる間隔を表すため、不可能であることは明らかです。(ほとんどの場合、隣接するタイムゾーンには例外があり、1つは夏時間で、もう1つはそうではありません。)同じ理由で、異なるタイムゾーン間の日付の計算も通常は実行できません。完全な答えを得るのに十分なデータがキャプチャされていない場合があります。

しかし、あなたが尋ねた質問の背後にあるあなたの懸念に対する完全な答えは、日付が何を意味するかによって異なります。たとえば、締め切りなどの法定日付である場合、それらの日付は、通常、締め切りが計時されているオフィスビルの場所を基準にして取得されます。その場合、日の境界は単一のタイムゾーンに従い、冗長に保存しても意味がありません。時刻は、保存時にそのタイムゾーンの日付に変換されます。

于 2012-12-06T01:20:22.347 に答える
2

私はかつて、複数のタイムゾーンで顧客を処理するリアルタイムトランザクションシステムの構築を設計および主導しましたが、すべて1つのタイムゾーンの期間に請求されました。

私にとってうまくいった解決策は、UTC時間と現地時間の両方を各レコードに保存することでした。これは、システムを数年間使用し、日付列には2つの別々の用途があることに気付いた後のことで、データはそのように保存されました。

ディスク上でさらに数バイトを消費しましたが(大したことですが、ディスクは安価です)、クエリを実行するときに非常に簡単になりました。顧客トランザクションを検索するヘルプデスクなどの「カジュアル」クエリでは現地時間列を使用し、経理部門の請求書バッチ実行などの「フォーマル」クエリではUTC列を使用しました。

また、夏時間が1時間戻るたびに、1時間のトランザクションを「回復」する現地時間の問題にも対処しました。これにより、24時間営業の場合、現地時間を使用するのは非常に困難になります。

于 2012-12-11T18:28:00.303 に答える
2

どこでも UTC を使用すると、作業が簡単になり、一貫性が保たれます。日付を(時点として)DBにUTCとして保存し、UTCで計算し、ビューレイヤーでのみローカル時間に明示的に変換し、ユーザー入力の日付をUTCに変換すると、必要なアクションまたは計算の非常に安定したベースが得られます彼らと。ユーザーに日付を UTC で表示する必要はありません。実際には現地時間で表示し、UTC で表示できることをほのめかしておけば、より有用な情報が得られます。
日付のみを保持する必要がある場合(誕生日、コメントで言及したものなど)、そのような情報を明示的に切り取ります(DBレベルでのDateTimeからDateへの変換、またはコードレベルの可能性など)。
これは、適切な正規化のサンプルです。コードページで UTF を使用している場合や、物理的な計算を行う同じ単位を維持している場合と同じことです。
このアプローチを使用すると、異なる日付のコードがはるかに簡単になります。UTC とローカルの間の日付と変換を表示する場合、多くのフレームワーク (または言語自体) は、UTC などを操作しながらローカルを処理するためのツールを提供します。

于 2012-12-10T05:47:43.707 に答える