【问题标题】:Replicating Rails timezone "magic" in Postgres在 Postgres 中复制 Rails 时区的“魔法”
【发布时间】:2018-11-07 18:15:14
【问题描述】:

有没有一种方法可以让 Postgres(我使用 Navicat,但将通过命令行工具演示)在时区和 UTC 方面表现得与 Rails 一样?

Rails 似乎做了一些让 Postgres 以 UTC 方式运行的魔法;而通过命令行(或 Navicat)它正在使用我的系统时区。这很令人困惑,因为结果会根据我是在 Ruby/Rails 还是在控制台中执行查询而有所不同。

我仍然在 Postgres 中与时区作斗争,但是让 Rails 和控制台表现出不同的行为令人抓狂。我可以解决这个问题吗?

这里是一个例子(不同的输出值):

-- in postgress:
# select ('2018-11-06' at time zone 'utc')::timestamptz;
        timezone
------------------------
 2018-11-06 08:00:00-08
(1 row)

-- in rails console
> ApplicationRecord.execute("select ('2018-11-06' at time zone 'utc')::timestamptz").first
   (0.5ms)  select ('2018-11-06' at time zone 'utc')::timestamptz
=> #<OpenStruct timezone="2018-11-06 00:00:00+00">

它们的格式都不同(-00 vs -08),更令人困惑的是,它们返回的实际时间不同。

Postgres 示例比 Rails 提前 16 小时返回结果!

【问题讨论】:

    标签: ruby-on-rails ruby postgresql navicat


    【解决方案1】:

    在我的理解中,这不是 Rails 的魔法,但 Rails 只是简单地使用 UTC 作为默认值。这就是为什么 Rails 可以并且确实使用 timezone 而不是 timezonetzcreated_at 等默认数据库类型的原因。

    如果您愿意,可以按如下方式修改 Rails 默认时区(请参阅official reference):

    # application.rb:
    class Application < Rails::Application
      config.time_zone = 'Eastern Time (US & Canada)'
    end
    

    至于 PostgreSQL,你的结果超前;你的默认时区似乎在美洲大陆的某个地方(比 UTC 晚 8 小时)。您可以按如下方式检查:

    postgres=> SET TIME ZONE 'America/New_York';
    postgres=> select ('2018-11-06' at time zone 'UTC')::timestamptz;
            timezone        
    ------------------------
     2018-11-06 05:00:00-05
    (1 row)
    

    我不知道Navicat 做了什么。但也许看看你的postgresql.conf。如果需要,您可以将 timezone 重置为 UTC(并重新启动 postgreSQL 服务器)。 详情请参阅this answer to "postgres default timezone"

    【讨论】:

    • 感谢您提供的信息。但是,除非我真的很困惑:2018-11-06 08:00:00-08 2018-11-06 00:00:00+00 早 16 小时。我在帖子中添加了一张照片,显示moment() 如何解释这两个时间戳值。 PS - 尽管我认为SET TIME ZONE 做到了。谢谢。
    • 我明白了,我和你在一起。 “08:00:00-08”是 -8 小时时区的上午 8 点,因此相当于 UTC 的下午 4 点。对不起,我也很困惑……
    猜你喜欢
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多