【发布时间】:2012-11-15 12:33:02
【问题描述】:
我需要在我的应用程序中使用多个时区。
基本上,我的系统会生成数据,全球任何地方的客户都可以访问它。
由于我的数据具有关联的时间戳,我考虑了以下处理时区的策略。
在 Postgres 中:
使用
::timestamptz类型为我的时间戳创建我的表。不允许使用没有时区的时间戳,因为在我的情况下,混合使用::timestamp和::timestamptz看起来像是一个定时炸弹。将我的 PG 服务器系统的时区设置为 `UTC。
在
postgresql.conf中设置timezone='UTC'(如果系统的 TZ 是 UTC,则可能不需要,但我有点偏执,它没有花费我任何成本)。-
创建我的表时添加以下检查:
CONSTRAINT timestamp_must_be_utc CHECK (date_part('timezone'::text, "my_timestamp_field") = 0::double precision)
以 UTC 格式存储我的所有时间戳
在客户端(python + pytz)
将客户的时区存储在他的个人资料中,例如
'America/Los Angeles'在查询数据时将时区信息发送到 postgres,这样我就可以获得
SELECT xxxx FROM yyyy WHERE my_ts >= '2012-11-27 19:13:00+01'::timestamptz之类的信息,然后让 Postgres 转换为 UTC。或者,我可以使用 pytz 进行转换,但 Postgres 似乎可以很好地完成这项工作。根据客户的时区转换时间戳,以便我可以正确显示数据 + 时间戳。
总而言之,我计划在任何地方都使用 UTC 来存储和查询数据,并在显示数据时只进行时区转换。
我对 Postgres 及其处理时区的方式没有太多经验。我知道在不同时区处理日期和时间有多么困难(一旦你必须处理航班时刻表,你就会很难学会使用 UTC 是进行日期和时间计算的唯一可靠方法)这就是我问的原因这个问题,以便比我更有经验的 postgres 用户可以确认或更正我的策略。
有趣的链接:
【问题讨论】:
标签: postgresql datetime timezone timestamp