Rails,Postgres和时区

3

我有一个表,其中有一个名为date的datetime字段。 当执行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个回答

8

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

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

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

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

大多数情况下,您确实应该使用 TIMESTAMP WITH TIME ZONE。只有在需要保留本地日期和时间值(例如在计划未来事件和计算工作时间之类的情况下),才应该使用 TIMESTAMP WITHOUT TIME ZONE。对于这些方案,将日期和时间拆分为单独的 DATETIME 字段通常更有意义。

最后一件事 - 如果可以避免使用Rails 时区,请尽量避免使用标准的tzdb 时区。"Australia/Brisbane" 是完整的 tzdb 标识符,相当于 Rails 的 "Brisbane" 时区。请参阅时区标签 wiki底部关于 Rails 时区的部分。


好的,感谢您的澄清。我已经检查了Rails中日期(04:30)的显示方式,您是正确的,它确实与我的时区匹配。 然而,有一些事情我不太明白。为什么Rails时间戳被正确保存,但这个却没有呢?我正在构建一个日程应用程序。为了维护,我们经常检查原始数据库查询以获取统计信息。看到04:30而不是14:30对于维护来说实际上非常困难。 - lkartono
不了解您的具体情况和代码,很难回答,但请浏览https://dev59.com/U3E85IYBdhLWcg3w8IbK。 - Matt Johnson-Pint
感谢提供链接,非常非常有用 :) - lkartono
你能解释一下为什么要避免使用Rails时区吗?选择其中一个与选择另一个有哪些实际区别? - Kelsey Hannan
1
@KelseyHannan - 请查看时区标签维基的底部。大多数情况下,请注意它们并未包含整个世界。许多时区都没有被列入Rails映射表中,因此缺失。这些映射表维护不良,且高度主观。在Rails之外,它们也没有任何意义,而IANA TZDB标识符在几乎所有系统中都是可互操作的。 - Matt Johnson-Pint

0

感谢您的回答。不幸的是,在我的情况下,服务器的时区不能依赖于浏览器。要求始终与服务器时区相关,无论用户位于何处。无论如何,这个宝石有一天可能会有用,所以感谢您的分享 :) - lkartono

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接