希望有人可以看到我在做什么错或误解。
我在Go Sandbox中使用了时间pkg,以熟悉如何正确使用时区特定的功能。
即使我已经知道一些补偿,我还是使用以下站点仔细检查了自己:https://documentation.mersive.com/content/topics/api-timezones.htm
在这种情况下,当我要求“America/New_York”的偏移量时,我期望为-14400。
但是,当我在Go Sandbox上运行以下命令时,却得到-18000:
https://play.golang.org/p/aU0JFHzueU1

americatz, err := time.LoadLocation("America/New_York")
if err != nil {
  fmt.Println(err)
  return
}

t := time.Now().In(americatz)
zone, offset := t.Zone()
fmt.Printf("%v :: %v\n", zone, offset)

我注意到当我将相同的代码带到linux机器上时,它确实达到了我的预期。我很紧张,因为我不确定为什么为什么两个输出的共同点会有所不同。
我知道LoadLocation从ZONEINFO env var查找一个zipfile。否则,它将在其他系统位置(例如$GOROOT/lib/time/zoneinfo.zip)中查找。
运行代码的Go Server与linux服务器具有不同的区域信息文件真的简单明了吗?而且,如果我希望在所有系统上都具有完全相同的行为……是否意味着我需要始终加载并设置自己的ZONEINFO变量?我觉得大多数人会期望-14​​400 ...
谢谢。

最佳答案

在操场上,time is set表示为“2009-11-10 23:00:00 UTC”,因为“通过提供确定的输出,可以更轻松地缓存程序。” (从“关于”框中)。
由于夏令时,这可能会对时区偏移产生影响。以下将给出您期望的答案:

today := time.Date(2020,10,16,0,0,0,0,americatz)
zone, offset = today.Zone()
fmt.Printf("%v :: %v\n", zone, offset)
Playground
更多细节:
由于夏令时,偏移量会根据时间而变化。例如:time.Date(2020,10,16,0,0,0,0,americatz).Zone()将返回有害的-14400,而time.Date(2020,1,16,0,0,0,0,americatz).Zone()将返回-18000
碰巧的是,now()在操场上返回的时间(2009-11-10)是EST(夏令时于2009年11月1日,星期日,凌晨2:00结束),而不是EDT。如果您在一个月后再次运行测试,您将不会看到这种差异,因为这两次都将在EST中进行。

关于go - 了解不同系统上的tz偏移差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64378404/

10-14 19:25
查看更多