我是否需要将Postgres中的所有现有日期时间从当前时区转换为UTC,或者Django 1.4时区在读取非UTC内容时会理解吗(但随后另存为UTC(。
我有一个非常好且工作正常的 Django 1.3/Postgres 网站,我可以在其中处理多个时区。我正在存储所有日期时间和时区信息,但这恰好在 Postgres 中设置为美国/东部时区(是的,我知道应该是 UTC(。
现在,我计划升级到 Django 1.4,并计划在那里使用 Django 时区支持。据我了解,它会将 UTC 中的所有日期时间保存到数据库中,这很好,但是我所有现有信息都设置了时区但不设置为 UTC。
有没有人根据这个迁移以及它是如何工作的,感觉要么我完全没有问题,要么我需要迁移大量的日期时间数据。
我正在存储所有日期时间和时区信息,但这恰好是设置的到美国/东部时区(是的,我知道应该是UTC(在Postgres。
这里有一些误解。
数据类型在PostgreSQL中称为timestamp
。没有称为"datetime"的类型.
timestamp
是 timestamp without time zone
.
的缩写 timestamptz
是timestamp with time zone
的缩写。
正如手册所告知的:
timestamp
值存储为午夜 2000-01-01 之前或之后的秒。
类似于 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如何通过示例和链接进行时间戳的详细说明:
- 在 Rails 和 PostgreSQL 中完全忽略时区
示例查询
请尝试以下语句(一次一个块(。也可以尝试使用您的专栏:
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;