Ruby on rails 3 转换用户时区中的日和小时

Ruby on rails 3 转换用户时区中的日和小时,ruby-on-rails-3,postgresql,timezone,Ruby On Rails 3,Postgresql,Timezone,我想将组日期(天+小时)转换为用户时区以显示列表,我不想更新数据库。我有几个小组,这个代码非常慢 # GROUP.RB # day -> Date # hour -> Time # wday -> Integer . . groups.each do |g| new_day = g.in_gmt_day(user_time_zone) # <-- Concat group.day with group.hour and convert the result da

我想将组日期(天+小时)转换为用户时区以显示列表,我不想更新数据库。我有几个小组,这个代码非常慢

# GROUP.RB
# day  -> Date
# hour -> Time
# wday -> Integer
.
.
groups.each do |g|
    new_day = g.in_gmt_day(user_time_zone) # <-- Concat group.day with group.hour and convert the result day with the user time zone.
    g.wday = new_day.wday
    g.hour = new_day
end
.
.
#GROUP.RB
#日期->日期
#小时->时间
#wday->Integer
.
.
组。每个组都有| g|

new_day=g.in_gmt_day(用户时区)#让Postgres为您做这件事:

SELECT (day + hour) AT TIME ZONE '<source tz>' AT TIME ZONE 'localtime'
FROM   groups;
  • 在源的时区设置此时间戳,让我们以“Europe/London”为例。结果是带有时区的
    时间戳(简称
    timestamptz
    ):

  • 显示等效的本地
    时间戳[无时区]

    (day + hour) AT TIME ZONE 'Europe/London' AT TIME ZONE 'localtime'
    
  • 从这里,您可以对该值执行任何操作,例如在一天内和一次内拆分,或者使用
    to_char()
    以任何方式格式化它:


    您是否有可能更改存储,以便存储一个带有时区的
    时间戳,如
    2012-01-01 11:00:00 UTC
    (日期2012-01-01,11小时)?这会让一切变得容易得多。
    (day + hour) AT TIME ZONE 'Europe/London'
    
    (day + hour) AT TIME ZONE 'Europe/London' AT TIME ZONE 'localtime'
    
    WITH x AS (
       SELECT (day + hour) AT TIME ZONE 'Europe/London' AT TIME ZONE 'localtime' AS ts
       FROM   groups
       )
    SELECT ts::date AS day, ts::time AS hour, to_char(ts, 'HH24') AS h24
    FROM   x;