【问题标题】:Postgres: How can I update timezone of a timestamp without changing the time?Postgres:如何在不更改时间的情况下更新时间戳的时区?
【发布时间】:2021-08-05 22:27:29
【问题描述】:

我正在使用 django 模型。 django 设置中的 TIMEZONE 是 UTC。 并通过算术构造时间戳。

return queryset.annotate(
            **{f"server_time":RawSQL(
                f'''
                SELECT TO_TIMESTAMP((FLOOR((EXTRACT(EPOCH FROM "{gmdts_table}"."date_key" AT TIME ZONE %s) + %s) / %s)::INTEGER * %s) - %s)::TIMESTAMP
                ''',
                params=[str(requested_time_zone), bucket_offset, time_interval, time_interval, bucket_offset]
            )}
        )

当我使用::timestamp 时,时间戳被返回为2021-07-26 00:00:00 如果我使用 ::TIMESTAMPTZ,它会变为 2021-07-26 00:00:00+00:00,即使 requested_time_zone 是 'America/New_York'

我希望输出为 2021-07-26 00:00:00-04:00 即。显示相同的时间,并附加“America/New_York”的偏移量。本质上我只是想附加偏移量。

我通过一些计算得出了这个时间戳,它实际上属于时区“America/New_York”(可以是任何时区,比如计算时间区)。

如何在不实际更改输出时间的情况下更新此时间戳的时区,即:

2021-07-26 00:00:00-04:00

当我使用AS TIME ZONE 'America/New_York' 时,我得到的输出为2021-07-26 04:00:00+00,这不是我想要的。

在 python 中,可以使用<datetime_object>.replace(tzinfo=new_time_zone) 轻松完成。我在 postgresql 中寻找同样的东西。

任何可以使用 django 数据库函数完成的方式都会有所帮助(我找不到任何方法)

【问题讨论】:

  • 这需要更多信息: 1) 这个字段的数据类型是什么? 2) 2021-07-26 00:00:00+00:00 在哪里返回? 3) 这是通过 Django 模型运行的吗? 4) settings 中的时区设置是什么?将此添加为问题的更新。
  • 完成!请回答。
  • "{gmdts_table}"."date_key" 的数据类型是什么?在我看来,你让这件事变得更复杂了。
  • 应该在psql 连接到数据库的客户端中添加什么:show TimeZone; 返回?
  • 时区 ---------- 等/UTC(1 行)

标签: postgresql django-views timestamp timestamp-with-timezone


【解决方案1】:

请务必了解 timestamptz 类型不存储时区!它只是存储 UTC 时间戳。这意味着您的时间戳不是“在错误的时区”,因为它不在任何时区。但是,它会在特定时区显示给您,由您的会话设置定义。

如果您需要将时间戳移动 4 小时(视情况而定),则可以为其添加 4 小时的间隔。但是,如果您需要将 UTC 时间戳“重新解释”为不同时区的时间戳(这意味着您可能在最初构建时间戳时做错了),那么您可以通过切换到时区原始时间戳并再次返回来实现:

SELECT timestamp AT TIME ZONE 'UTC' AT TIME ZONE 'America/New_York'

但是,如果这个新的时间戳显示在与以前相同的时区,请不要感到惊讶,因为这是由您的会话设置定义的,而不是由时间戳本身定义的。

【讨论】:

    【解决方案2】:

    剥离时区,然后添加回您想要的新时区。这可以通过以下方式完成:

    (myfield::timestamp || '+00:00')::timestamptz
    

    【讨论】:

    • 我不知道时区是什么,所以我不能硬编码 +00:00
    • 如果您不回答我在评论中对您的问题提出的问题,这将是一系列关于您拥有什么和想要什么的猜谜游戏?请提供答案以更新您的问题。
    猜你喜欢
    • 2018-07-24
    • 2014-12-23
    • 2021-01-31
    • 2019-11-01
    • 2023-03-09
    • 2015-10-26
    • 1970-01-01
    • 2013-09-30
    • 2017-11-18
    相关资源
    最近更新 更多