Go从哪里获取时区信息?

时间:2016-08-09 14:29:01

标签: go

我遇到了与时区相关的Go代码问题,该问题将返回1900-01-01 01:00:00 +0100 CET1900-01-01 00:53:28 +0053 LMT,具体取决于正在运行的计算机:

https://play.golang.org/p/K3ceq1n1KI

我能够排除Go版本作为差异的来源。 Go从哪里获取时区信息?

1 个答案:

答案 0 :(得分:1)

实际上取决于。

检查time.LoadLocation()源及其上方的注释。特别是,它说:

// LoadLocation looks in the directory or uncompressed zip file
// named by the ZONEINFO environment variable, if any, then looks in
// known installation locations on Unix systems,
// and finally looks in $GOROOT/lib/time/zoneinfo.zip.

您应该记住,在Unix / Posix系统(例如Linux)上,“已知安装位置”始终提供正确的时区数据文件。但在其他系统上没有这样的位置。因此,在Windows上,LoadLocation区域将找不到任何时区(除非ZONEINFO或GOROOT配置正确)并且将仅使用默认值(如果我的内存正确,则为UTC)。

但是,您在上面描述的LMT问题是有点不同的野兽。你看,LMT并不是一个恰当的时区。例如。见here。而且我没有弄清楚究竟是从哪里来的,但我怀疑它与你转换时尚未确定的时区有关。所以,go似乎正在计算该地方的LMT。

例如,如果您只是在游乐场示例中将年份从1900年更改为2000年(甚至是1905年),那么它将提供正确的时区(CET)。

至于机器之间的区别,我认为在实际引入之前定义时区规则的最自然方式是多么有争议。因此,我认为在某些时区数据库中,时区中第一个规则的开始时间将被省略或调整以将其进一步扩展到过去。而其他人则会在那里放置一个LMT偏移。 (尽管大多数(如果不是全部)都是以某种方式从同一个IANA数据库派生出来的。)

如果你想在不同的机器上确保完全相同的行为,我想建立你自己的zoneinfo.zip并设置ZONEINFO变量应该有所帮助。