在用户时区中转换日期和小时

时间:2012-08-23 11:06:41

标签: 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 day with the user time zone.
    g.wday = new_day.wday
    g.hour = new_day
end
.
.

任何人都可以帮助我?

感谢。

1 个答案:

答案 0 :(得分:1)

让Postgres为你做这件事:

SELECT (day + hour) AT TIME ZONE '<source tz>' AT TIME ZONE 'localtime'
FROM   groups;

这样做

  1. 在两列数据类型timestamp [without time zone]date中创建time(假设此处,问题对于确切的数据类型是模糊的):

    day + hour
    
  2. 在源的时区设置此时间戳,让我们以“欧洲/伦敦”为例。结果为timestamp with time zone(简称timestamptz):

    (day + hour) AT TIME ZONE 'Europe/London'
    
  3. 显示等效的本地timestamp [without time zone]

    (day + hour) AT TIME ZONE 'Europe/London' AT TIME ZONE 'localtime'
    
  4. 从这里你可以对价值做任何事情,比如一天又一次地分开,或者用to_char()以任何你喜欢的方式格式化:

    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;