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

Postgres:如何在不更改时间的情况下更新时间戳的时区?

鲍向笛
2023-03-14

我正在使用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如果我使用::timestamp,它将变为2021 07月26日00:00:00,即使请求的\u时区是“美国/纽约”

我希望输出为2021 07月26日00:00:00-04:00,即显示与“附加美国/纽约”偏移量相同的时间。实际上,我只想附加偏移量。

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

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

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

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

在python中,使用<代码>

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

共有2个答案

翁硕
2023-03-14

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

(myfield::timestamp || '+00:00')::timestamptz
满昊然
2023-03-14

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

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

sql prettyprint-override">SELECT timestamp AT TIME ZONE 'UTC' AT TIME ZONE 'America/New_York'

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

 类似资料:
  • 我正在从数据库中获取UTC时间戳,我正在将其设置为JodaTime实例 它完美地存储时间,比如,但带有当地时区。例如,我在IST时区,从UTC开始是5:30 我已经尝试了很多改变时区的东西,但每一件事都可以通过使用5:30的差异将时间从更改为其他时间 有什么方法可以在不影响当前时间的情况下更改时区吗 编辑:如果我现在的时间是: 以下是我使用这个时的结果; 下面是我使用这个时的结果;

  • 问题内容: 我正在从数据库中获取UTC时间戳,这是我设置为JodaTime 实例的时间 它完美地存储了时间,但带有本地时区。例如,我处于IST时区,即UTC的+5:30 我尝试了很多更改时区的方法,但每件事都会通过使用+5:30时差将时间从其他时间更改为其他时间 有什么方法可以更改TimeZone而不影响当前时间 编辑:如果我当前时间是: 以下是我使用这个的结果 以下是当我使用它的结果; 问题答案

  • 我正在使用FluentD(v.12最后一个稳定版本)向Kafka发送消息。但是FluentD正在使用一个旧的KafkaProducer,所以记录时间戳总是设置为-1。因此,我必须使用WallclockTimestampExtrator将记录的时间戳设置为消息到达kafka时的时间点。 是否有特定于Kafka Streams的解决方案? 我真的感兴趣的时间戳,是由Fluentd在消息中发送的: “时

  • 我正在使用咖啡因缓存,并寻找一种方法来更新缓存中的值,而不更改其过期时间。 场景是我使用缓存来加速数据加载。数据更改延迟5秒是可以接受的,而我希望返回速度很快。此外,我希望这些缓存在第一次命中1天后过期,以避免不必要的内存使用。 因此,我希望每个缓存的密钥持续一天,但其值每5秒更新一次。 方法似乎已关闭,但刷新持续时间后的第一个返回值仍然是旧值。这对我来说并不理想,因为两次点击之间的持续时间可能是

  • 问题内容: 我在mysql表中具有属性为“ ON UPDATE CURRENT_TIMESTAMP”的时间戳。有没有办法在特殊情况下手动禁用更新时间戳?(例如:更新条目以修改博客文章,但不重新添加日期) 问题答案: 有没有办法在特殊情况下手动禁用更新时间戳?(例如:更新条目以修改博客文章,但不重新添加日期) 听起来您需要配置默认约束,以便仅在插入时填充列: 将其更改为仅这意味着任何修订都不会触发时

  • 问题内容: 我在玩JPA(具体来说是Eclipselink)。下面的实体具有一个时间戳,应该在该实体上次更新时反映该时间戳。 每次更改此实体时,使JPA自动更新该时间戳的策略是什么? 如果我还想要一个“创建”时间戳记,该时间戳记仅在实体首次保留时设置,而永远不允许再次更改,该怎么办? 问题答案: 使用@PrePersist和@PreUpdate批注并编写您自己的事件侦听器。 详细了解一下此答案。它