我有一个完美的和工作的Django 1.3 / Postgres网站,我处理多个时区.我正在存储所有的datetime w.时区信息,但这恰好设置为美国/东部时区(是的,我知道应该是UTC)在Postgres.
现在,我计划升级到Django 1.4,并计划在那里使用Django时区支持.从我的理解,它将保存UTC中的所有datetime到数据库,这很好,但是我所有现有的信息时区设置,但不是UTC.
有没有人根据这个迁移,它是如何工作的,感觉就像我没有任何问题,或者我需要迁移大量的datetime数据.
I am storing all datetime w. timezone info but this happens to be set
to US/Eastern timezone (yes,I know should have been UTC) in Postgres.
这里有几个误解.
数据类型在Postgresql中称为时间戳.没有名为“datetime”的类型.
时间戳是timestamp without time zone
的缩写.
时间戳是timestamp with time zone
的缩写.
手册通知:
timestamp
values are stored as seconds before or after midnight 2000-01-01.
类似于Posix时间,从Unix epoch 1970-01-01 00:00 UTC开始的30年前.对于时间戳,假定本地2000-01-01 00:00.对于timestamptz,参考号为2000-01-01 00:00 UTC,并根据输入和输出对时区偏移量进行调整.
带有时区的时间戳只是另一种输入和表示唯一时间点的方式.您不能将时间戳(带或不带时区)“设置为任何其他时区(UTC).时区偏移本身根本不保存.它只用于将值调整为UTC.
时间戳值的表示将考虑当前时区设置
好消息:您的移民工作应该刚刚开箱即用,只要您不要积极地搞砸.
我已经详细说明了Postgres时间戳如何在this related answer中使用示例和链接.
示例查询
尝试以下语句(一次一个块).也可以用你的专栏:
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;