【问题标题】:Retain time zone information from postgresql timestamp in go在 go 中保留来自 postgresql 时间戳的时区信息
【发布时间】:2017-08-28 20:03:33
【问题描述】:

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

2017-08-28 09:00:00+02, 2017-12-31 23:00:00+01

使用字符串和时间。时间第一个给出相对于 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

【问题讨论】:

  • 我看不出问题出在哪里。它确实保留了时区。 play.golang.org/p/Lj_uxCts1R 。哦等等...我明白了,你对 sqlx 的解析方式感到不安。
  • 您是否尝试过在结构中使用string 而不是time.Time,然后使用我的操场链接中的布局自己解析它?
  • 我实际上开始怀疑您是否有旧版本的 pq 驱动程序并需要更新。根据我看过的代码和我看过的测试用例 (github.com/lib/pq/blob/e42267488fe361b9dc034be7a6bffef5b195bceb/…),正确处理 TimeZones 应该没有问题。我建议你运行go get -u github.com/lib/pq
  • retain time zone information 到底是什么意思? Date:"2017-08-28T07:00:00Z" 等于 2017-08-28 09:00:00+02sec:63650354400 是自 零时间(第一年 1 月 1 日,00:00:00.000000000 UTC)以来的秒数,等于 2017-12-31 23:00:00+01跨度>
  • @RayfenWindspear 感谢您的意见。 pq-driver 是几天前安装的,所以更新并没有改变解析。 Date 被解析为字符串,RepeatUntil 被解析为 time.Time。如果您使用“疑虑”这个词来讽刺,我希望您不要那样做,而不是回答。

标签: postgresql datetime go


【解决方案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;

【讨论】:

    【解决方案2】:

    时区可以在单个连接期间配置,也可以通过altering数据库中的时区设置来配置。

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

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

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 2014-10-15
      相关资源
      最近更新 更多