5

アプリケーションで複数のタイムゾーンを扱う必要があります。

基本的に、私のシステムはデータを生成し、顧客は地球上のどこからでもアクセスできます。

私のデータにはタイムスタンプが関連付けられているため、タイムゾーンを処理する次の戦略について考えました。

Postgres の場合:

  • ::timestamptzタイムスタンプのタイプでテーブルを作成します。タイムゾーンのないタイムスタンプは混合として許可されず、私の場合は時限爆弾のよう::timestamp::timestamptz見えます.

  • PG サーバー システムのタイム ゾーンを UTC に設定します。

  • 設定timezone='UTC'postgresql.confます (システムの TZ が UTC の場合は必要ないかもしれませんが、私は少し偏執的で、費用はかかりません)。

  • テーブルを作成するときに次のチェックを追加します。

    CONSTRAINT timestamp_must_be_utc CHECK (date_part('timezone'::text, "my_timestamp_field") = 0::倍精度)

  • すべてのタイムスタンプを UTC で保存する

クライアント側 (python + pytz )

  • 次のように、顧客のタイムゾーンをプロファイルに保存する'America/Los Angeles'

  • データをクエリするときにタイムゾーン情報をpostgresに送信して、SELECT xxxx FROM yyyy WHERE my_ts >= '2012-11-27 19:13:00+01'::timestamptzPostgresにUTCへの変換を行わせるようなものを取得できるようにします。別の方法として、変換にpytzを使用することもできますが、Postgres はこの作業をうまく行うようです。

  • データとタイムスタンプを正しく表示できるように、顧客のタイムゾーンに従ってタイムスタンプを変換します。

要約すると、データの保存とクエリにはどこでも UTC を使用し、データを表示するときはタイムゾーン変換のみを使用する予定です。

私は Postgres とそれがタイムゾーンを処理する方法についてあまり経験がありません。異なるタイムゾーンで日付と時刻を処理するのがいかに難しいかを知っています (フライト スケジュールを扱う必要があると、UTC を使用することが日付と時刻の計算を行うための唯一の信頼できる方法であるという難しい方法を学びます) これが私が質問している理由ですこの質問により、経験豊富なpostgresユーザーが私の戦略を確認または修正できるようになります。

興味深いリンク:

4

1 に答える 1

7

好みに応じて紅茶/コーヒーを用意し、1 時間程度取っておき、タイムスタンプの処理に関するマニュアルの詳細を読んでください。少し遊んでみると、すべてが明らかになります。

"timestamp with time zone" (timestamptz) を使用している場合は、異なるタイムゾーンを処理しても問題ありません。実際には「絶対タイムスタンプ」という名前が付けられているはずで、内部的にはUTC です。タイムゾーン部分は保存されず、絶対時間に到達するために使用されます。

そのため、更新時にすべてのタイムスタンプに関連するタイムゾーンが含まれていることを確認してから、クライアントのタイムゾーンを適切に設定してください。提供されたタイムゾーンに関係なく、クライアントのタイムゾーンで返されます。

手間がかかるのは、1 日が常に 24 時間であるとは限らず (1 時間が 3600 秒でない場合もあります)、国や歴史によって DST が異なる日付で発生するという事実に対処することです。これは PostgreSQL ではありませんが、これは単なる現実の世界です。

于 2012-11-27T20:28:45.600 に答える