我的表有一个名为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
想法?
答案 0 :(得分:3)
2015-11-20T14:30:00+10:00
表示14:30
的当地时间比UTC早10个小时。您的数据库字段反映了04:30
的正确UTC值。这通常是理想的行为,特别是如果值代表时间戳 - 发生的日期和时间(过去时)。
在PostgreSQL中,有两种不同类型的时间戳字段(reference)
TIMESTAMP WITH TIME ZONE
字段接受包含时区偏移的输入。然后,它将值转换为UTC以进行存储。在检索时,它使用会话的timezone
设置。
TIMESTAMP
或TIMESTAMP WITHOUT TIME ZONE
只存储给定的日期和时间,忽略任何偏移,而不是转换为UTC。
大多数情况下,您确实应该使用TIMESTAMP WITH TIME ZONE
。如果您需要保留本地日期和时间值,则应仅使用TIMESTAMP WITHOUT TIME ZONE
,例如安排未来事件和计算营业时间。对于这些情况,将日期和时间分成单独的DATE
和TIME
字段通常更有意义。
最后一件事 - 如果可以避免,请避免使用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