Ruby on rails Rails、Postgres和时区

Ruby on rails Rails、Postgres和时区,ruby-on-rails,postgresql,datetime,timezone,Ruby On Rails,Postgresql,Datetime,Timezone,我有一个表,它有一个名为date的datetime字段。在执行POST以插入新行时,从客户端(浏览器)发送的日期看起来像2015-11-20T14:30:00+10:00,实际上是正确的日期和时区 然而,在Postgres中,该日期被插入为2015-11-20 04:30:00.000000,正如您所看到的,与上述日期完全不同。我知道问题与时区有关。但我似乎无法找到解决办法 有关信息,我已配置我的应用程序时区: class Application < Rails::Application

我有一个表,它有一个名为
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
类应用程序

想法?

我发现这个gem非常有用,而且很容易正确设置时间

我发现这个gem非常有用,也很容易正确设置时间

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

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

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

  • 时间戳
    ,或不带时区的
    时间戳
    只存储给定的日期和时间,忽略任何偏移,不转换为UTC

大多数情况下,您确实应该在时区中使用时间戳。如果您需要保留本地日期和时间值,例如在安排未来事件和计算营业时间时,您应该只使用不带时区的时间戳。对于这些场景,将日期和时间拆分为单独的
date
time
字段通常更有意义


最后一件事——如果你能避免,就避免使用标准。“澳大利亚/布里斯班”是与Rails“布里斯班”时区等效的完整tzdb标识符。请参阅页面底部的Rails时区部分。

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

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

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

  • 时间戳
    ,或不带时区的
    时间戳
    只存储给定的日期和时间,忽略任何偏移,不转换为UTC

大多数情况下,您确实应该在时区中使用时间戳。如果您需要保留本地日期和时间值,例如在安排未来事件和计算营业时间时,您应该只使用不带时区的时间戳。对于这些场景,将日期和时间拆分为单独的
date
time
字段通常更有意义


最后一件事——如果你能避免,就避免使用标准。“澳大利亚/布里斯班”是与Rails“布里斯班”时区等效的完整tzdb标识符。请参阅页面底部关于Rails时区的部分。

谢谢您的回答。不幸的是,在我的例子中,服务器的时区不能依赖于浏览器。无论用户位于何处,需求始终与服务器时区相关。无论如何,这颗宝石总有一天会有用的,所以谢谢分享:)谢谢你的回答。不幸的是,在我的例子中,服务器的时区不能依赖于浏览器。无论用户位于何处,需求始终与服务器时区相关。无论如何,这颗宝石总有一天会有用的,所以谢谢分享:)好的,谢谢你的澄清。我已经检查显示Rails中的日期(
04:30
one),您是对的,它确实与我的时区匹配。然而,有件事我不明白。为什么Rails时间戳实际上被正确保存,而不是这个?我正在构建的系统是一个日程表应用程序。为了维护,我们经常检查原始数据库查询的内部,以便进行统计。查看
04:30
而不是
14:30
实际上很难维护。如果不了解您的具体场景和代码,很难回答,但请仔细查看,谢谢链接。真的很有用:)你能解释一下为什么要避开Rails时区吗?选择其中一个与另一个之间的实际区别是什么?@KelseyHannan-见本报告的底部。大多数情况下,认为他们不包括整个世界。许多时区丢失,在Rails映射中没有条目。他们维护不善,固执己见。除了Rails之外,它们也没有任何意义,因为在Rails中,IANA TZDB标识符几乎可以跨所有系统进行互操作。好的,感谢您的澄清。我已经检查显示Rails中的日期(
04:30
one),您是对的,它确实与我的时区匹配。然而,有件事我不明白。为什么Rails时间戳实际上被正确保存,而不是这个?我正在构建的系统是一个日程表应用程序。为了维护,我们经常检查原始数据库查询的内部,以便进行统计。看到
04:30
而不是
14:30
对维护来说确实很难。不知道mor很难回答