首页 > 解决方案 > 了解不同系统上的 tz 偏移差异

问题描述

希望有人能看到我做错了什么,或误解。我在 Go Sandbox 中使用 time 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 机器上时,它完全符合我的预期。我很紧张,因为我不太清楚为什么非常常见的 tz 的两个输出会不同。我知道LoadLocation从 ZONEINFO env var 中查找 zipfile 的知识已经足够了。否则它会在其他系统的地方,比如$GOROOT/lib/time/zoneinfo.zip.

运行代码的 Go 服务器与 linux 服务器具有不同的区域信息文件,这真的很简单吗?如果我希望在所有系统中都具有完全相同的行为……这是否意味着我需要始终加载并设置我自己的 ZONEINFO 变量?我觉得大多数人会期望-14​​400 ...

谢谢。

标签: gotimezone

解决方案


在操场上,时间设置为“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)

操场

更多细节:

由于夏令时,偏移量随时间变化;例如:

time.Date(2020,10,16,0,0,0,0,americatz).Zone()将返回一个节日,-14400time.Date(2020,1,16,0,0,0,0,americatz).Zone()将返回-18000

恰好now()返回操场 ( 2009-11-10) 的时间是EST(夏令时结束,2009 年 11 月 1 日,星期日,凌晨 2:00),而不是EDT。如果您在一个月内再次运行测试,您将不会看到这种差异,因为两次都将在EST.


推荐阅读