在Go中,您可以通过添加ZONEINFO环境变量来指定要使用的特定zoneinfo.zip文件,该变量指向要用于时区信息的特定文件。这很棒,因为它可以确保前端和后端使用的IANA时区数据库的版本相同。
但是,似乎没有任何方法可以检测对指定区域信息文件的使用是否失败。查看源代码(https://golang.org/src/time/zoneinfo.go),看来使用指定文件的任何错误都会悄然失败,然后继续检查默认的操作系统位置或默认的$ GOROOT位置,以从那里获取时区信息。这不是我想要的行为,因为我肯定会知道我正在使用指定版本的区域信息。
我从解决方案的角度考虑了以下内容,但我对其中的任何一个都不满意。
有人知道一种更优雅的方式来确保我使用的是我的ZONEINFO环境变量指定的zoneinfo.zip文件吗?
更新:为解决此问题,我也从下面@chuckx的回答中得到启发,并将a Go package组合在一起,以使您猜测使用哪个时区数据库。自述文件中包含有关如何使用Go安装获取正确版本的时区数据库的说明。
答案 0 :(得分:2)
也许考虑不依赖环境变量?
如果您不反对分发解压缩的文件集,则可以轻松使用LoadLocationFromTZData(name string, data []byte)
。第二个参数是单个时区文件的内容。
作为参考,可在未导出的功能loadTzinfoFromZip()
中找到处理zip文件的功能。
从@Slotherooo的评论中提取的逐步方法:
time.loadTzinfoFromZip(zipfile, name string) ([]byte, error)
的本地版本[]byte
文件中提取timeinfo.zip
用于所需位置time.LoadLocationFromTZData()
代替time.LoadLocation