我想将组日期(日+小时)转换为用户时区以显示列表,我不想更新数据库。我有几个小组,这段代码很慢。
# 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
.
.
任何人都可以帮助我?
感谢。
答案 0 :(得分:1)
让Postgres为你做这件事:
SELECT (day + hour) AT TIME ZONE '<source tz>' AT TIME ZONE 'localtime'
FROM groups;
这样做
在两列数据类型timestamp [without time zone]
和date
中创建time
(假设此处,问题对于确切的数据类型是模糊的):
day + hour
在源的时区设置此时间戳,让我们以“欧洲/伦敦”为例。结果为timestamp with time zone
(简称timestamptz
):
(day + hour) AT TIME ZONE 'Europe/London'
显示等效的本地timestamp [without time zone]
:
(day + hour) AT TIME ZONE 'Europe/London' AT TIME ZONE 'localtime'
从这里你可以对价值做任何事情,比如一天又一次地分开,或者用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;