16

我是否需要将 Postgres 中的所有现有日期时间从其当前时区转换为 UTC,或者 Django 1.4 时区在读取非 UTC(但随后保存为 UTC)时是否会理解。

我有一个非常好的和工作的 Django 1.3/Postgres 网站,我可以在其中处理多个时区。我正在存储所有日期时间 w。时区信息,但这恰好在 Postgres 中设置为美国/东部时区(是的,我知道应该是 UTC)。

现在,我计划升级到 Django 1.4 并计划在那里使用 Django 时区支持。据我了解,它将UTC中的所有日期时间保存到数据库中,这很好,但是我所有现有的时区设置但不设置为UTC的信息呢?

有没有人根据这个迁移过,它是如何工作的,感觉要么我完全没有问题,要么我需要迁移大量的日期时间数据。

4

1 回答 1

19

我正在存储所有日期时间 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;
于 2012-05-05T13:42:08.977 回答