2017-08-28 5 views
0

私はタイムゾーン付きタイムスタンプとしてdateとrepeat_untilという列を持つpostgresql dbを持っています。サンプルの日付には、タイムゾーン固有の形式があります。後者は冬の時間です。postgresqlタイムスタンプからのタイムゾーン情報を保持

2017-08-28 09:00:00+02、文字列を使用して2017-12-31 23:00:00+01

とtime.Timeは、最初は、GMT + 0、後者秒(ないUNIXタイムスタンプ)に相対的な時間を与えます。

import (
    _ "github.com/lib/pq" 
    "fmt" 
    "github.com/gorilla/mux" 
    "github.com/jmoiron/sqlx" 
    "log" 
    "net/http" 
    "time" 
) 

type Event struct { 
    Date   string 
    RepeatUntil  time.Time `db:"repeat_until"` 
} 


event := Event{} 
rows, _ := db.Queryx("select * from events order by date") 
for rows.Next() { 
    err := rows.StructScan(&event) 
    if err != nil { 
     log.Fatalln(err) 
    } 
    fmt.Printf("%#v", event) 
} 

Date:"2017-08-28T07:00:00Z"

RepeatUntil:time.Time{sec:63650354400, nsec:0, loc:(*time.Location)(nil)}

タイムゾーン情報を保持するための推奨方法は何ですか? timeTimeは明らかですが、私はunixtimeで3986年の秒にどのようになったのかよくわかりません。

私はsqlxを使用しています。

+0

することによって得ることができます。タイムゾーンは保持されます。 https://play.golang.org/p/Lj_uxCts1R。ああ待って...私は、あなたの苦境は 'sqlx'がそれをどのように解析しているかである。 – RayfenWindspear

+0

'time.Time'の代わりに' string'を使って構造体にしようとしましたが、私の遊び場のリンクのようにレイアウトでそれを解析していますか? – RayfenWindspear

+0

'pq'ドライバの古いバージョンがあり、アップデートが必要なのかどうか疑問に思っています。私が見たコードと、私が見たテストケース(https://github.com/lib/pq/blob/e42267488fe361b9dc034be7a6bffef5b195bceb/encode_test.go#L191)によると、TimeZonesを適切に処理する問題はないはずです。 'get get -u github.com/lib/pq'を実行することをお勧めします。 – RayfenWindspear

答えて

1

PostgreSQLのタイムゾーンはセッションパラメータです。つまり、セッション(接続)ごとに指定できます。指定しない場合、タイムゾーンはpg_hba.confにパラメータを設定することから推測されます。レコードを選択すると、データベースのタイムゾーンからセッション(接続)のタイムゾーンに日付/時刻データが自動的に変換されます。

あなたの場合、特定のタイムゾーンで時刻を取得するには、接続パラメータで明示的に指定してください。

psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+ 
    "dbname=%s sslmode=disable TimeZone=Europe/Paris", 
    host, port, user, dbname) 
db, err := sqlx.Open("postgres", psqlInfo) 

TimeZoneは、私は問題が何であるかが表示されない

select * from pg_timezone_names; 
0

タイムゾーンは、単一接続中に設定することも、alteringで設定することもできます。

alter database foo set timezone to 'Europe/Oslo';

これは、その時間帯のためにフォーマットされた日付を返します。

関連する問題