私はさまざまな ways の「見る」時間と、それをPostgresで適切にマッピングする方法についてかなりの調査を行ってきましたが、実際に何を使用するかはまだわかりません。いくつかの articles 推奨または persuade 日付をtimestamp with time zone
として保存し、timestamp
として保存することはできません。私は夏時間に特に苦労しています。
私の使用例は、「ヨーロッパ/ベルリン」タイムゾーンの人だけからアクセスされる単純なエンドユーザー向けアプリケーションです。ユーザーは、作成および更新のタイムスタンプとともに保存される投稿を書き込みます。
ユーザーが2020-01-01T10:00:00+01
に投稿を公開するとします。ユーザーが即日にその投稿を読んだ場合、posted on 1st of January at 10 am
と表示されます。同じ記事が7月のベルリンでクリックされた場合でも、DSTに関係なくposted on 1st of January at 10 am
と表示されます。
私の直感は現在、時刻をtimestamp without time zone
として格納することです。それ以外の場合、Postgresはその時刻をUTCに変換し、そのように格納するためです。後で、投稿が公開された実際のタイムゾーンを参照することはできません。その場合、それはposted on 1st of January at 11 am
と表示され(ベルリンが2時間進んでいるため)、著者を混乱させる可能性がありました。彼らが最初に投稿を公開した時間を確認します。
私の考えは正しいですか、そしてtimestamp with time zone
を使用しないコーナーケースの1つを見つけましたか、またはここで重要な何かを見逃していますか?
私の使用例は、「ヨーロッパ/ベルリン」タイムゾーンの人だけからアクセスされる単純なエンドユーザー向けアプリケーションです。 [...]
私の直感は、時間を
timestamp without time zone
[...]後で、投稿が公開された実際のタイムゾーンを参照することはできません。
これは、誤解が不幸なデータ型名に起因することを示しています:
timestamp without time zone
(= timestamp
)timestamp with time zone
(= timestamptz
)どちらでもないデータ型は、タイムゾーン情報をまったく格納しません。 timestamptz
は、現在のセッションの timezone
設定 を考慮に入れる input と出力ロジックを追加し、/からUTC時間に射影しますそれに応じて。
それが混乱したとしても、恥ずかしがらないでください。
Ifステートメントが信頼できる場合:
「ヨーロッパ/ベルリン」タイムゾーンの人々からのみアクセスできます。
...次に、timestamp
を使用することもできます。付随するタイムゾーンを知っている。そして、入力と出力の間の変換はありません。あなたはその場でtimestamptz
に変換することができます:
my_column AT TIME ZONE 'Europe/Berlin'
アプリが現在のスコープを超える場合、timestamptz
に切り替えて、複数のタイムゾーンからの入力を簡単に促進するには、次のように変換します。
ALTER TABLE tbl ALTER col TYPE timestamptz
USING my_column AT TIME ZONE 'Europe/Berlin'
タイムゾーン名 'Europe/Berlin'を使用してください、ハードコードされたオフセットではありませんDSTの変動に合わせて調整できません。 タイムゾーンの略語、これはハードコードされたオフセットの名前です-非常によくある誤解の1つです。
またはすぐにtimestmaptz
を使用して、すべての不測の事態をカバーします。
いずれかの方法で、要求されたようにタイムゾーンを保持するには、それを明示的に(追加の列に)格納する必要があります。あなたはもはや「ヨーロッパ/ベルリン」と仮定することはできません。
関連: