当前位置: 首页 > 知识库问答 >
问题:

postgresql中使用时区的策略

狄望
2023-03-14

我需要在应用程序中使用多个时区。

基本上,我的系统生成数据,来自地球上任何地方的客户都可以访问它。

由于我的数据有一个关联的时间戳,我考虑了以下策略来处理时区。

在邮件中:

>

  • 使用::timestamptz类型为我的时间戳创建我的表。不允许使用不带时区的时间戳,因为在我的情况下,混合使用::timestamp::timestamptz就像是一个定时炸弹。

    将我的PG服务器系统的时区设置为`UTC。

    postgresql.conf中设置timezone='UTC'(如果系统的TZ是UTC,可能就不需要了,但我有点偏执,这没有花我什么钱)。

    创建“我的表”时添加以下检查:

    约束timestamp_must_be_utc检查(date_part('timezone'::text,“my_timestamp_field”)=0::双精度)

    将我的所有时间戳存储为UTC

    在客户端(python+pytz)

    >

  • 将客户的时区存储在其个人资料中,如“America/Los Angeles”

    在查询数据时将时区信息发送给postgres,这样我就可以获得类似从yyyy中选择xxxx,其中my_ts>='2012-11-27 19:13:00+01'::timestamptz并让postgres将其转换为UTC。或者,我可以使用pytz进行转换,但看起来Postgres可以很好地完成这项工作。

    根据客户的时区转换时间戳,这样我就可以正确地显示数据+时间戳。

    总而言之,我计划在任何地方都使用UTC来存储和查询数据,在显示数据时只使用一个时区转换。

    我对Postgres和它处理时区的方式没有太多的经验。我知道处理不同时区的日期和时间是多么困难(一旦你不得不处理航班时刻表,你就会学到使用UTC是进行日期和时间演算的唯一可靠的方法)这就是为什么我要问这个问题的原因,以便更有经验的用户可以确认或纠正我的策略。

    有趣链接:

    • https://stackoverflow.com/A/9576170/1121179
    • https://stackoverflow.com/A/10462428/1121179
  • 共有1个答案

    庄嘉
    2023-03-14

    根据自己的喜好泡一杯茶/咖啡,留出一个小时左右的时间,阅读手册中关于时间戳处理的细节。玩一会就会明白的。

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

    所以--确保所有的时间戳都包含更新时的相关时区,然后只需适当地设置客户端时区。它们将在客户端的时区返回给您,而不管它们是在哪个时区提供的。

    一天并不总是24小时(有时一小时不是3600秒),而且DST发生在不同的日期,这取决于国家和历史。但这不是PostgreSQL,这只是真实的世界。

     类似资料:
    • 在本例中,应为。 列datatype是)。以下是我的疑问: 不转换为PST时区:

    • 我是否需要将Postgres中所有现有的日期时间从当前时区转换为UTC,或者当读取不是UTC的东西时,Django 1.4时区是否会理解(但随后保存为UTC)。 我有一个非常好的Django 1.3/Postgres网站,可以处理多个时区。我正在存储所有datetime w。时区信息,但在Postgres中这恰好设置为美国/东部时区(是的,我知道应该是UTC)。 现在,我计划升级到Django 1

    • 使用带有PostgreSQL JDBC驱动程序的PostgreSQL数据库,我遇到了一个有趣的挑战。似乎最新版本的驱动程序9.2在执行日期/时间匹配时使用客户端时区。 null

    • 我是PostgreSQL的新手,我想知道是否有一种直接的方法可以使用函数将表中的时间戳值转换为不同的时区。在我的情况下,是UTC到EST。 例如,我需要将这些值转换为EST(不仅仅是一个值,而是表中的所有值)

    • 来自postgres是PostgreSQL的默认和特殊用户吗? PostgreSQL中的用户与可以登录的角色相同。通常,nologin 角色用作组,但这不是必需的。 把自己从用户和组的概念中解放出来。有些角色可以登录。角色可以是其他角色的成员。 基本上,用户和组的概念被合并到角色中。但在我看来,仍然存在区别。 “nologin角色用作组,但这不是必需的。”这是否意味着 > < li> 非登录角色可

    • 我知道我可以为单列和复合列创建索引。A我还可以对一些表达式建立索引: 在按某种条件搜索数据的表达式上创建索引,而首先我指定字段首先需要排序,然后按条件输出结果,并基于此表达式构建索引。 (就像使用Couchbase时的索引) 但是我找不到关于这个的信息: 如果创建记录,我是否需要在同一事务中再次调用以创建此数据的索引(索引如上所述) 我看不出把它分成几个问题有什么意义,事实上,这是一个关于使用Sp