【问题标题】:How to map Rails timezone names to PostgreSQL?如何将 Rails 时区名称映射到 PostgreSQL?
【发布时间】:2014-06-18 16:59:49
【问题描述】:

我需要使用类似于
SELECT * FROM items WHERE to_char(created_at AT TIME ZONE 'RAILS_GIVEN_ZONE', 'DD/MM/YYYY') ILIKE '%5/02%'的查询

RAILS_GIVEN_ZONE 值应始终使用 Rails 4 应用程序中的时区(可由用户更改),而不是 PG 的 timezone 选项。

但问题是 Rails 和 PG 的时区并不完全一一对应。

使用偏移量(如Time.zone.now.formatted_offset 中的+10:00)不够好,因为在这种情况下,PG 将无法正确处理夏令时。

那么问题是将 Rails 当前时区 (Time.zone) 自动映射到 PostgreSQL 的 named 时区的最佳方法是什么?

注意:create_at 列是 timestamptz(存储为 UTC,显示在任何需要的区域)

【问题讨论】:

  • "不够好,因为在这种情况下 PG 将无法正确处理夏令时。" - 你不是说:因为 Rails 没有正确处理 DST 吗? (PG 可以很好地处理它,使用 timestamptz 类型。)
  • @Denis no PG 物理上无法仅从偏移量中了解夏令时,因为该偏移量通常有多个区域。阅读postgresql.org/docs/9.1/static/…
  • 不回答这个问题,但可能对这个话题很感兴趣:stackoverflow.com/questions/9571392/…
  • @Denis "时区缩写,例如 PST。这样的规范仅定义了与 UTC 的特定偏移量,与可能暗示一组夏令时转换的完整时区名称相反-date 规则。识别的缩写列在 pg_timezone_abbrevs 视图中(参见第 45.66 节)。您不能将配置参数 timezone 或 log_timezone 设置为时区缩写,但您可以在日期/时间输入中使用缩写值和 AT TIME ZONE 运算符。"
  • @Denis 感谢您提供指向其他 SO 答案的链接。但我很清楚这一点,它与我的问题完全无关。

标签: ruby-on-rails ruby postgresql timezone


【解决方案1】:

ActiveSupport::TimeZone 中似乎定义了一个MAPPING 常量,其中包含的值,除非我弄错了,否则 Postgres 都应该支持:

http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html

根据文档:

键是 Rails 时区名称,值是 TZInfo 标识符。

如果你不想直接使用MAPPING 常量,里面有一个find_tzinfo 方法,它似乎返回了一个TZInfo::TimezoneProxy

http://rubydoc.info/gems/tzinfo/TZInfo/TimezoneProxy

后者采用identifier 方法,该方法应包含所需的字符串。

【讨论】:

  • 感谢丹尼斯·德·伯纳迪!所以你说可以写ActiveSupport::TimeZone.find_tzinfo(Time.zone.name).identifier 来获取应用程序默认时区的PostgreSQL 标识符。哎呀,有人知道更简洁的方法吗?
猜你喜欢
  • 2014-12-27
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多