将时区信息添加到现有时间

时间:2019-11-01 17:39:34

标签: go time timezone

假设我具有以下条件:

  • Postgres数据库中具有TIMESTAMP列的表。
  • 数据库时区设置为UTC以外的其他时间。
  • 一些使用CURRENT_TIMESTAMPNOW()插入时间戳值的SQL语句

如Postgres文档所述:

  

CURRENT_TIMESTAMP()函数返回一个TIMESTAMP WITH TIME ZONE,它表示事务开始的日期和时间。

因此,以下语句无声地将本地时间戳转换为绝对时间戳:

INSERT INTO foo (id, timestamp_column) VALUES (0, CURRENT_TIMESTAMP);


假设Go程序将这些数据读入time.Time对象中,那么该对象将具有一个空的Location

fmt.Println(timeFromDb.Location().String() == "") // true

,被解释为UTC。至此,我确实知道Go时间timeFromDb实际上不是UTC,并且我还知道数据库时区设置是什么。

如何在不重新解释该时间对象的情况下为该时间对象设置正确的时区?这样:

fmt.Println(timeFromDb) // 2009-11-10 10:00:00
fmt.Println(timeFromDb.Location()) // <empty>
fmt.Println(timeFromDb.UTC()) // 2009-11-10 10:00:00
// magic?
fmt.Println(timeFromDb) // 2009-11-10 10:00:00
fmt.Println(timeFromDb.Location()) // America/Vancouver
fmt.Println(timeFromDb.UTC()) // 2009-11-10 18:00:00

1 个答案:

答案 0 :(得分:1)

您可以重新解释它:

loc,_:=time.LoadLocation("America/Vancouver")
t2:=timeFromDb.In(loc)
_,off:=t2.Zone()
theTime:=t2.Add(-time.Duration(off)*time.Second)

您还可以进行一些字符串操作,但是我怀疑这会更快。