Rails、Postgres 和时区

lka*_*ono 1 postgresql timezone datetime ruby-on-rails

我有一个表,其中有一个名为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
Run Code Online (Sandbox Code Playgroud)

想法?

Mat*_*int 6

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

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

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

  • TIMESTAMP,或TIMESTAMP WITHOUT TIME ZONE干脆将被赋予的日期和时间,忽略任何偏移,而不是转换为UTC。

大多数情况下,您确实应该使用TIMESTAMP WITH TIME ZONE. 仅TIMESTAMP WITHOUT TIME ZONE当需要保留本地日期和时间值时才应使用,例如在安排未来事件和计算营业时间时。对于那些场景,往往更有意义,分割日期和时间成单独DATETIME领域。

最后一件事 - 如果可以避免,请避免使用Rails 时区并使用标准tzdb 区域。“Australia/Brisbane”是完整的 tzdb 标识符,相当于 Rails 的“布里斯班”时区。请参阅时区标记 wiki底部有关 Rails 时区的部分。