2017-08-28 124 views
0

我有一個postgresql數據庫,其中列date和repeat_until作爲帶時區的時間戳。示例日期具有時區特定的格式。後者是冬季時間。保留來自postgresql時間戳的時區信息go

2017-08-28 09:00:00+022017-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)}

什麼是保留的時區信息推薦的方法是什麼?時間似乎很明顯,但我不確定它是如何到達unixtime 3986年的秒數的。我正在使用sqlx

+0

獲得我看不出有什麼問題。它保留了時區。 https://play.golang.org/p/Lj_uxCts1R。哦,等等......我明白了,你的問題在於'sqlx'如何解析它。 – RayfenWindspear

+0

您是否嘗試過在結構中使用'string'而不是'time.Time',然後使用佈局來解析它,就像在我的操場鏈接中一樣? – RayfenWindspear

+0

我實際上開始懷疑你是否可能有一箇舊版本的'pq'驅動程序,需要更新。根據我瀏覽過的代碼和我見過的測試用例(https://github.com/lib/pq/blob/e42267488fe361b9dc034be7a6bffef5b195bceb/encode_test.go#L191),正確處理TimeZones應該沒有問題。我建議你運行'go 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';

這將返回格式化該時區的日期。