Rails、Postgres 和时区
Rails, Postgres and Timezone
我有 table,其中有一个名为 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
想法?
我发现这个 gem 对于正确设置时间来说非常有用且容易 https://github.com/kbaum/browser-timezone-rails
2015-11-20T14:30:00+10:00
表示14:30
的当地时间比UTC早10个小时。您的数据库字段反映了 04:30
的正确 UTC 值。这通常是期望的行为,特别是如果该值表示 timestamp - 某事发生的日期和时间(过去时)。
在 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 and use standard tzdb zones. "Australia/Brisbane" is the full tzdb identifier equivalent to the Rails "Brisbane" time zone. Refer to the section on Rails time zones at the bottom of the timezone tag wiki。
我有 table,其中有一个名为 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
想法?
我发现这个 gem 对于正确设置时间来说非常有用且容易 https://github.com/kbaum/browser-timezone-rails
2015-11-20T14:30:00+10:00
表示14:30
的当地时间比UTC早10个小时。您的数据库字段反映了 04:30
的正确 UTC 值。这通常是期望的行为,特别是如果该值表示 timestamp - 某事发生的日期和时间(过去时)。
在 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 and use standard tzdb zones. "Australia/Brisbane" is the full tzdb identifier equivalent to the Rails "Brisbane" time zone. Refer to the section on Rails time zones at the bottom of the timezone tag wiki。