假设我具有以下条件:
TIMESTAMP
列的表。 CURRENT_TIMESTAMP
或NOW()
插入时间戳值的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
答案 0 :(得分:1)
您可以重新解释它:
loc,_:=time.LoadLocation("America/Vancouver")
t2:=timeFromDb.In(loc)
_,off:=t2.Zone()
theTime:=t2.Add(-time.Duration(off)*time.Second)
您还可以进行一些字符串操作,但是我怀疑这会更快。