我有一个postgresql数据库,其中包含date和repeat_until列作为时区的时间戳。示例日期具有特定于时区的格式。后者是冬天。
2017-08-28 09:00:00+02
,2017-12-31 23:00:00+01
使用string和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)}
保留时区信息的推荐方法是什么? time.Time似乎很明显,但我不确定如何在unixtime中获得3986年的秒数。
我正在使用sqlx。
答案 0 :(得分: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;
答案 1 :(得分:0)
可以在单个连接期间配置时区,也可以通过altering数据库中的时区设置进行配置。
alter database foo set timezone to 'Europe/Oslo';
这将返回为该时区格式化的日期。