我遇到了与时区相关的 Go 代码问题,它会返回 1900-01-01 01:00:00 +0100 CET
或 1900-01-01 00:53:28 +0053 LMT
,取决于正在运行的机器:
https://play.golang.org/p/K3ceq1n1KI
我能够排除 Go 版本是差异的来源。 Go 从哪里获取时区信息?
最佳答案
实际上这取决于。
检查 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。
例如,如果您只是在 playground 示例中将年份从 1900 更改为 2000(甚至 1905),它会显示正确的时区 (CET)。
至于机器之间的区别,我想说在实际引入时区规则之前定义时区规则的最自然方式是什么是非常有争议的。结果,我想在某些时区数据库中,时区中第一条规则的开始时间将被省略或调整以将其进一步扩展到过去。而其他人会在那里放置 LMT 偏移量。 (尽管大多数(如果不是全部的话)都以某种方式从同一个 IANA 数据库派生。)
如果您想确保在不同机器上的行为完全相同,我认为构建您自己的 zoneinfo.zip 并设置 ZONEINFO 变量应该会有所帮助。
关于go - Go 从哪里获取时区信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38853564/