IT の 2 つの惨劇のうちの 1 つは、タイムスタンプとタイム ゾーン (もう 1 つは文字エンコーディング) であり、何度も何度も遭遇し続けます...
その点で、私は現在、PostgreSQL データベースに格納する Java アプリケーション内のさまざまなタイムスタンプに関連する問題を抱えています。
簡単にするために、次の表があると仮定します。
CREATE TABLE ts_test
(
id integer NOT NULL,
utc timestamp without time zone,
local timestamp with time zone,
CONSTRAINT pk PRIMARY KEY (id)
)
そのため、UTC タイム スタンプとローカル タイム スタンプを保存する必要があります。私の場合は中央ヨーロッパの夏時間なので、現在は UTC+2 です。
さらに、テーブルに 2 つのエントリがあると仮定すると、psql コンソールに次のように出力されます (データベースは UTC で実行されます)。
# select id, utc, local, local-utc as diff from ts_test;
id | utc | local | diff
----+---------------------+------------------------+----------
1 | 2012-06-27 12:00:00 | 2012-06-27 12:00:00+00 | 00:00:00
2 | 2012-06-27 12:00:00 | 2012-06-27 14:00:00+00 | 02:00:00
(2 rows)
ここで、いくつかの疑問が生じます。
- ローカル列の出力は正確には何を意味していますか?
- システムはタイムゾーンをどのように認識しますか?値を挿入しましたか?
- 保存されている実際の生の値 (ミリ秒など) を確認するにはどうすればよいですか?
最初の行のローカルの「12:00:00+00」は、UTC では 12:00、CEST では 14:00 であることを意味していると思います。しかし、2 行目のローカルの "14:00:00+00" は、CEST 14:00 の正しい値であると思われます (これは 2 時間の差分でサポートされています)。
しかし、SQL挿入を介して2行目を生成するには、次のように書く必要があります
insert into ts_test (id, utc, local) values (2, '2012-06-27 12:00:00', '2012-06-27 16:00:00+02');
これもまた、述語をサポートしません。
この長い質問を要約すると、この全体がどのように詳細に機能するか、出力が何を意味するのか、ローカルタイムスタンプをデータベースに正しく書き込む方法について誰か教えてもらえますか?