【问题标题】:Convert day and hour in user time zone转换用户时区的日期和小时
【发布时间】:2012-08-18 21:13:22
【问题描述】:

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

# 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
.
.

谁能帮帮我?

谢谢。

【问题讨论】:

  • 是否有机会更改存储空间,以便存储单个 TIMESTAMP WITH TIME ZONE 字段,例如 2012-01-01 11:00:00 UTC(日期为 2012-01-01,第 11 小时)?它会让一切变得容易得多。

标签: ruby-on-rails-3 postgresql timezone


【解决方案1】:

让 Postgres 为你做这件事:

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

这样

  1. datetime 两列数据类型中创建一个timestamp [without time zone](假设这里的问题对于确切的数据类型含糊不清):

    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'
    

从这里你可以对这个值做任何事情,比如一次又一次地分割,或者用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;

【讨论】:

    猜你喜欢
    • 2014-01-17
    • 2013-08-20
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 2021-08-14
    相关资源
    最近更新 更多