Rails、Postgres 和时区

Rails, Postgres and Timezone

我有 table,其中有一个名为 date 的日期时间字段。当执行 POST 以插入新行时,从客户端(浏览器)发送的日期看起来像 2015-11-20T14:30:00+10:00,这实际上是正确的日期和时区。

然而,在 Postgres 中,这个日期被插入为 2015-11-20 04:30:00.000000,如您所见,与上面的完全不同。我知道问题与时区有关。但我似乎无法找到解决办法。

有关信息,我已经配置了我的应用程序时区:

class Application < Rails::Application
  config.time_zone = 'Brisbane'
end

想法?

我发现这个 gem 对于正确设置时间来说非常有用且容易 https://github.com/kbaum/browser-timezone-rails

2015-11-20T14:30:00+10:00表示14:30的当地时间比UTC早10个小时。您的数据库字段反映了 04:30 的正确 UTC 值。这通常是期望的行为,特别是如果该值表示 timestamp - 某事发生的日期和时间(过去时)。

在 PostgreSQL 中,有两种不同类型的时间戳字段(reference)

  • TIMESTAMP WITH TIME ZONE 字段接受包含时区偏移量的输入。然后它将值转换为 UTC 以进行存储。在检索时,它使用会话的 timezone 设置。

  • TIMESTAMPTIMESTAMP WITHOUT TIME ZONE只存储给定的日期和时间,忽略任何偏移,不转换为UTC。

大多数时候,您确实应该使用 TIMESTAMP WITH TIME ZONE。如果您需要保留本地日期和时间值,例如在安排未来事件和计算营业时间时,您应该只使用 TIMESTAMP WITHOUT TIME ZONE。对于这些情况,将日期和时间拆分为单独的 DATETIME 字段通常更有意义。

最后一件事 - 如果可以避免,请避免使用 Rails time zones and use standard tzdb zones. "Australia/Brisbane" is the full tzdb identifier equivalent to the Rails "Brisbane" time zone. Refer to the section on Rails time zones at the bottom of the timezone tag wiki