16

Postgresの既存のすべての日時を現在のタイムゾーンからUTCに変換する必要がありますか、それともDjango 1.4タイムゾーンはUTCではないものを読み取るときに理解しますか(ただし、UTCとして保存します)。

私は、複数のタイムゾーンを処理する、完全に正常に機能するDjango 1.3 /PostgresWebサイトを持っています。私はすべての日時を保存していますw。タイムゾーン情報ですが、これはPostgresではUS / Easternタイムゾーン(はい、UTCである必要があります)に設定されています。

今、私はDjango 1.4にアップグレードし、そこでDjangoタイムゾーンサポートを使用することを計画しています。私が理解していることから、UTCのすべての日時がデータベースに保存され、これは問題ありませんが、タイムゾーンが設定されているがUTCには設定されていない既存のすべての情報についてはどうでしょうか。

誰かがこれに従って移行しましたか、そしてそれはどのように機能しましたか、私はまったく問題がないか、たくさんの日時データを移行する必要があるように感じます。

4

1 に答える 1

19

すべての日時を保存していますw。タイムゾーン情報ですが、これはたまたま Postgres で米国/東部タイムゾーン (そうです、UTC であるべきだったはずです) に設定されています。

ここにはいくつかの誤解があります。

データ型はtimestampPostgreSQL で呼び出されます。「datetime」という型はありません。
timestampの略ですtimestamp without time zone
timestamptzの略ですtimestamp with time zone

マニュアルが通知するように:

timestamp値は、2000 年 1 月 1 日午前 0 時前後の秒数として保存されます。

Unix エポック1970-01-01 00:00 UTCで 30 年前に始まる Posix 時間に似ています。の場合timestampローカル 2000-01-01 00:00が想定されます。timestamptz参考までに、表示は2000-01-01 00:00 UTC入力と出力の現在のセッションのタイム ゾーン オフセットに合わせて調整されます。

timestamp with time zone一意の時点を保存します。タイムスタンプ (タイム ゾーンの有無にかかわらず) を UTC 以外のタイム ゾーンに内部的に「設定」することはできません。タイム ゾーン オフセット自体はまったく保存されません。入力/出力をUTCに調整するためにのみ使用されます。

タイムスタンプ値の表現では、現在のセッションのタイム ゾーン設定が考慮されます。

  • それに応じて値を表示します (出力)。
  • timestamp without time zoneaを正しく解釈する(入力)。

良いニュース: 移行は、積極的に台無しにしない限り、箱から出してすぐに動作するはずです。

例とリンクを含む Postgres タイムスタンプの詳細な説明:

クエリの例

次のステートメントを試してください (一度に 1 ブロックずつ)。そして、あなたのコラムでも試してみてください:

SHOW timezone;

SELECT '2011-05-24 11:17:11.533479-05'::timestamptz(0);
SELECT '2011-05-24 11:17:11-05'::timestamptz;

SET timezone='UTC';
SELECT '2011-05-24 11:17-05'::timestamptz;

SELECT '2011-05-24 11:17-05'::timestamptz AT TIME ZONE 'UTC';

SELECT '2011-05-24 11:17-05'::timestamptz AT TIME ZONE 'UTC' AT TIME ZONE 'UTC';

RESET timezone;
于 2012-05-05T13:42:08.977 に答える