0

グループの日付(日+時間)をユーザーのタイムゾーンに変換してリストを表示したいのですが、データベースを更新したくありません。私にはいくつかのグループがあり、このコードは非常に遅いです。

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

誰かが私を助けることができますか?

ありがとう。

4

1 に答える 1

1

Postgresにこれを任せましょう:

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

これはします

  1. timestamp [without time zone]データ型の2つの列からを作成しdatetime(ここでは、正確なデータ型についての質問があいまいであると仮定します):

    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;
于 2012-08-23T15:05:11.600 に答える