我正在存储所有日期时间 w。时区信息,但这恰好在 Postgres 中设置为美国/东部时区(是的,我知道应该是 UTC)。
这里有几个误解。
数据类型timestamp
在 PostgreSQL 中被调用。没有称为“日期时间”的类型。
timestamp
是 的缩写timestamp without time zone
。
timestamptz
是 的缩写timestamp with time zone
。
如手册所述:
timestamp
值存储为 2000 年 1 月 1 日午夜之前或之后的秒数。
类似于 Posix 时间,它从 30 年前的Unix 纪元1970-01-01 00:00 UTC 开始。对于timestamp
,假设是局部的。 2000-01-01 00:00
作为timestamptz
参考2000-01-01 00:00 UTC
,显示会针对当前会话在输入和输出上的时区偏移进行调整。
timestamp with time zone
存储一个唯一的时间点。您不能在内部将时间戳(带或不带时区)“设置”为 UTC 以外的任何其他时区。时区偏移本身根本不保存。它仅用于将输入/输出调整为 UTC。
时间戳值的表示考虑了当前会话的时区设置。
- 相应地显示值(输出)。
- 正确解释
timestamp without time zone
(输入)。
好消息:您的迁移应该开箱即用 - 只要您不主动搞砸。
Postgres时间戳如何用示例和链接详细解释:
示例查询
尝试以下语句(一次一个块)。也可以在您的专栏中尝试一下:
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;