这种混乱源于这样一个事实,即直观地出现在脑海中的API
In
简单地将同一时间点解释为处于不同的时区。所以当你打印它时,显示不是你想要的。
要将时区设置为时间戳,同时保持相同的显示值,只需使用
time.Date
具有与原始时间戳和新位置相同的值:
t := time.Date(myTime.Year(), myTime.Month(), myTime.Day(), myTime.Hour(), myTime.Minute(), myTime.Second(), myTime.Nanosecond(), loc)
// 2009-11-10T23:00:00-05:00 in the playground
另一个选项是将时间实例设置为新时区,然后使用
Zone()
以获取偏移量,然后从本地化时间中减去以秒为单位的值。
package main
import (
"fmt"
"time"
)
func main() {
myTime := time.Now()
fmt.Println(myTime.Format(time.RFC3339))
loc, err := time.LoadLocation("America/New_York")
if err != nil {
panic(err)
}
locTime := myTime.In(loc)
_, zoneOffset := locTime.Zone()
inZoneTime := locTime.Add(-time.Duration(zoneOffset) * time.Second)
// handle DST transitions
if inZoneTime.IsDST() {
inZoneTime = inZoneTime.Add(1*time.Hour)
}
fmt.Println(inZoneTime.Format(time.RFC3339))
// 2009-11-10T23:00:00-05:00
}
今天要在您的本地机器中测试夏令时转换(假设您所在的国家/地区和我一样),您可以将位置更改为夏令时有效的位置,例如。
Australia/Canberra
.
输入为
time.Now()
无DST进入
澳大利亚/堪培拉
,上述程序打印以下内容:
2021-11-12T13:27:33+01:00
is DST: true
2021-11-12T13:27:33+11:00
游戏场
https://play.golang.org/p/5qy2tOcIMwn