保留post中的postgresql时间戳的时区信息

时间:2017-08-28 20:03:33

标签: postgresql datetime go

我有一个postgresql数据库,其中包含date和repeat_until列作为时区的时间戳。示例日期具有特定于时区的格式。后者是冬天。

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

2 个答案:

答案 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';

这将返回为该时区格式化的日期。