【问题标题】:Strategy about working with timezones in postgresql在 postgresql 中使用时区的策略
【发布时间】: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


    【解决方案1】:

    根据喜好给自己泡杯茶/咖啡,留出一个小时左右的时间,阅读手册的details 上的timestamp 处理。玩一会就明白了。

    如果您使用“带时区的时间戳”(timestamptz),则处理不同的时区没有问题。它确实应该被命名为“绝对时间戳”并且在内部 UTC。不存储时区部分,它只是用于获取绝对时间。

    所以 - 请确保您的所有时间戳都包含更新时的相关时区,然后适当地设置您的客户端时区。无论提供的时区如何,它们都会在客户的时区返回给您。

    它确实需要处理这样一个事实,即一天并不总是 24 小时(有时一小时也不是 3600 秒),而且 DST 发生在不同的日期,具体取决于国家和历史。不过那不是 PostgreSQL,那只是真实的世界。

    【讨论】:

    • 夏令时是人类历史上最愚蠢的想法之一。它既不能节省任何时间(显然),也没有任何好处 - 只是混乱和骚扰。
    • 好消息!当我成为世界皇帝(tm)时,我会解决这个问题。坏消息是,我让每个人都采用 GMT(我住在格林威治附近),并调整地球轨道以消除闰秒和闰年。
    • 你在下一届世界皇帝(tm)选举中拥有我的一票!不是吹毛求疵,而是修行星的轨道,这不是越权吗?
    • 不。还配有明-无情风格的银色斗篷 :-)
    • 也许我们应该杀死所有不住在 +00 线附近的人来简化代码
    猜你喜欢
    • 2019-09-24
    • 2012-02-06
    • 2010-09-30
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多