我认为 IT 的两个祸害之一是时间戳和时区(另一个是字符编码),人们一次又一次地绊倒......
在这方面,我目前有一个与存储到 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。但似乎(我们的数据库管理员告诉我)第二行的本地“14:00:00+00”是 14:00 CEST 的正确值 - 2 小时的差异支持这一点。
但是要通过 sql insert 生成第二行,我必须写
insert into ts_test (id, utc, local) values (2, '2012-06-27 12:00:00', '2012-06-27 16:00:00+02');
这又不支持该谓词。
所以,总结这个长长的问题 - 谁能告诉我这整个事情是如何详细工作的,输出应该是什么意思,以及应该如何将本地时间戳正确写入数据库?