【问题标题】:How do I get a Range of ActiveSupport::TimeWithZone from a tstzrange column?如何从 tstzrange 列中获取 ActiveSupport::TimeWithZone 范围?
【发布时间】:2020-03-03 01:05:02
【问题描述】:
我有一个tstzrange column。 Rails 正在将其转换为 Range 的 Time 对象,这会丢失时区信息。我想要一个 Range 的 ActiveSupport::TimeWithZone 对象。我该怎么做?
另外,我如何检查tstzrange 是否正好跨越当前时区的一天,以及哪一天?
【问题讨论】:
标签:
ruby-on-rails
postgresql
ruby-on-rails-6
【解决方案1】:
来自ActiveRecord::Timestamp docs...
您还可以添加特定于数据库的时区感知类型。例如,对于 PostgreSQL:
ActiveRecord::Base.time_zone_aware_types += [:tsrange, :tstzrange]
in_time_zone 将在应用程序的时区将Time 转换为ActiveSupport::TimeWithZone。时间范围可以变成 ActiveSupport::TimeWithZone 的范围,如下所示:
range = Range.new(
tstzrange.begin.in_time_zone,
tstzrange.end.in_time_zone,
# Taking care to preserve whether the range is inclusive or exclusive.
tstzrange.exclude_end?
)