【问题标题】:How to return current date in a different timezone in PostgreSQL如何在 PostgreSQL 中返回不同时区的当前日期
【发布时间】:2016-10-27 06:56:44
【问题描述】:

我正在开发一个使用东部时间并将数据库设置为太平洋时间的应用程序。这引起了一些问题,但我们被告知不可能有任何其他方式,所以我们只需要解决它。

无论如何,我遇到的麻烦之一就是获得今天的约会。由于数据库在太平洋,如果我在凌晨 1 点使用current_date 询问今天的日期,它会给我昨天的日期。我已经尝试设置时区和添加/减去间隔,但它似乎从来没有像我期望的那样工作,我宁愿不必在凌晨 1 点进行广泛的测试来让它工作。

是否有一种简单的方法可以在 PostgreSQL 中返回给定时区中今天日期的 DATE?

【问题讨论】:

    标签: postgresql date timezone


    【解决方案1】:

    select current_date at time zone 'UTC',current_date::timestamp ; 或任何其他区域

    更新

    select (current_date at time zone 'UTC')::date,current_date::date

    【讨论】:

    • 这个答案给我 Postgres 9.6.5 的错误结果。在我写这篇文章时,它是 2017-09-29T05:00Z(我在 UTC+10,那是我的 Postgres 时区),但 select (current_date at time zone 'UTC')::date 说的是 2017-09-28。相比之下,select (current_timestamp at time zone 'UTC')::date 现在给出了正确的 UTC 日期2017-09-29
    • 我相信这实际上是将当前日期(在 db tz 中)转换为给定的 tz。不是那个 tz 中的当前日期。
    • 'at time zone ..' 首先将日期从 current_date 转换为日期+时间戳;将时间设置为 00:00。然后,它添加任何时区偏移量。如果是例如2/2,下午 4 点在伦敦,您为“澳大利亚/悉尼”执行此操作,您仍将获得 2/2(因为它将是 2/2 00:00 + 11 = 2/2 11AM)。相反,您想使用current_timestamp,正如@SimonKissane 所建议的那样。
    【解决方案2】:
    SELECT date(timezone('EST', now()))
    

    无论数据库时区如何,都会以Eastern Standard Time 返回当前日期

    (或任何其他时区,但是,无论出于何种原因,都可以使用偏移量......)

    SELECT date(timezone('UTC±XX', now()::timestamp))
    

    如果您想使用偏移量,这将UTC offsets 一起使用...

    【讨论】:

    • 以上不适用于UTC 偏移量的原因是因为postgresql 假定给定值是POSIX time-stamp,它与UTC 偏移量基本相同,但带有一个倒号和完全任意的字母组合。
    猜你喜欢
    • 2020-01-18
    • 2013-12-23
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多