Rails,Postgres和Timezone

时间:2015-11-05 02:59:55

标签: ruby-on-rails postgresql datetime timezone

我的表有一个名为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

想法?

2 个答案:

答案 0 :(得分:3)

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

在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并使用标准tzdb zones。 &#34;澳大利亚/布里斯班&#34;是完整的tzdb标识符,相当于Rails&#34; Brisbane&#34;时区。请参阅timezone tag wiki底部的Rails时区部分。

答案 1 :(得分:0)

我发现这个宝石非常有用,而且很容易正确设置时间https://github.com/kbaum/browser-timezone-rails