2015-11-05 62 views
1

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

但是,在Postgres里面,这个日期已被插入为2015-11-20 04:30:00.000000,正如你所看到的,它与上述内容完全不一样。我知道问题与时区有关。但我似乎无法找出解决办法。

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

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

想法?

回答

3

2015-11-20T14:30:00+10:00意味着14:30本地时间为UTC提前10小时非常有用的和容易。您的数据库字段反映了正确的UTC值04:30。这通常是期望的行为,尤其是如果该值表示时间戳 - 发生的某个日期和时间(过去时)。

在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。 “澳大利亚/布里斯班”是完全相当于Rails“布里斯班”时区的tzdb标识符。请参阅timezone tag wiki底部的Rails时区部分。

+0

好的谢谢你的澄清。我检查过从Rails显示日期('04:30'),你说得对,它与我的时区相符。 但是,有一些我不明白。为什么Rails时间戳实际上保存正确,而不是这个?我正在构建的系统是一个时间表应用程序。为了进行维护,我们经常检查原始数据库查询的统计用途。看到'04:30'而不是'14:30'实际上很难维护。 – lkartono

+0

如果不知道更多关于您的特定风景和代码的内容,很难回答,但请通过http:// stackoverflow查看。com/questions/2532729 /日光节约时间和时区最佳做法 –

+0

感谢您的链接。真的很有用:) – lkartono

0

我发现这个宝石是正确设置时间https://github.com/kbaum/browser-timezone-rails

+0

感谢您的回答。不幸的是,服务器的时区不能依赖于浏览器。无论用户身在何处,该要求总是与服务器时区相关。无论如何,这个宝石可能是有用的一天或其他,所以谢谢分享:) – lkartono