web-dev-qa-db-ja.com

タイムゾーン付きのPostgresタイムスタンプ

「events」テーブルに「timestampwithtimezone」タイプの列「event_date_time」があります。私のpython flaskアプリケーションは'2014-08-30 02:17:02+00:00'のように日付を保存していますが、postgresは自動的にそれを'2014-08-30 07:17:02+05'に変換します。タイムスタンプを私のローカルに変換しますタイムゾーン、つまりパキスタン。変換せずに保存したい。試した

set timezone = 'UTC'

タイムゾーンを「UTC」に変更しますが、pgadmin3は変換された時間を節約しています。

MACOSとPostgresql9.3を使用しています。

7
Waseem

Pgadminが+5時間を表示している理由は、システムのタイムゾーンがこれに設定されているためです。 「タイムスタンプ付きタイムスタンプ」の値をGMT +または-任意の値で保存すると、システムは入力されたタイムゾーンをGMT(またはUTC)にオフセットするため、取得するときに必要なタイムゾーンを指定できます。に表示されました。

たとえば、たとえばニューヨークの現在の時刻を設定しましょう。

select now()::timestamp with time zone at time zone 'America/New_York';

質問したところ、「2014-08-23 08:50:57.136817」が返されました。土曜日の朝8:50、または衒学者の場合は8:51。

同じ時間を取得してGMTで表示すると、異なる結果が表示されます。

select '2014-08-23 08:50:57.136817 America/New_York'::timestamp with time zone at time zone 'GMT';

今、「2014-08-23 12:50:57.136817」の新しい時間があります...「未来」への5時間!

最後に、元のタイムスタンプを取得して、パキスタンのタイムゾーン(PKT)と思われる場所に表示し、表示される内容を確認しましょう。

select '2014-08-23 08:50:57.136817 America/New_York'::timestamp with time zone at time zone 'PKT';

結果? '2014-08-23 17:50:57.136817'さらに未来へ!

繰り返しますが、これができる理由は、入力時間オフセットを常にUTCまたはGMTに変換しているためです。 Postgresは、すべての「タイムスタンプ付きタイムスタンプ」データ型をこのように処理します。夏時間などのタイムゾーンの問題を回避するように設計されています。

あなたの問題は、pythonが+00のオフセットで時間を挿入していることであるようです。これが現地時間であると想定されていた場合、postgresに関する限り5時間オフになります。 。pythonが行っているクエリを正確に知らなくても、それが正しい時間を与えていることを確認するためにそれを調べたいと思うかもしれません。おそらくset timezone='PKT'修正する必要があります。いずれにせよ、pgadminなどのブラウザを使用してタイムゾーン付きのタイムスタンプを表示している場合、タイムスタンプはローカルタイムゾーンに変換されているため、+ 5が表示されます。

または、これらの時刻を+00で表示したい場合は、SELECTクエリでこれを指定する必要があります。

18
Lucas