代码之家  ›  专栏  ›  技术社区  ›  Slotheroo

检测区域信息是否在go中失败

  •  3
  • Slotheroo  · 技术社区  · 8 年前

    在go中,可以通过添加指向要用于时区信息的特定文件的zoneinfo环境变量来指定要使用的特定zoneinfo.zip文件。这很好,因为它允许我确保我在前端和后端使用的IANA时区数据库的版本是相同的。

    但是,似乎没有任何方法可以检测指定区域信息文件的使用是否失败。查看源代码( https://golang.org/src/time/zoneinfo.go ,使用指定文件的任何错误看起来都会悄悄失败,然后go将继续检查默认操作系统位置或默认的$goroot位置以从中提取时区信息。这不是我想要的行为,因为我想知道我肯定我正在使用我指定版本的区域信息。

    我已经考虑过以下解决方案,但我对其中任何一个都不满意。

    1. 我可以检查环境变量是否是自己设置的,但这最多是一个部分解决方案,因为它不会告诉我loadlocation是否真正可以使用该文件。
    2. 我可以确保不存在区域信息的备份位置。这看起来有点极端,意味着我必须非常小心代码在dev和production设置中运行的环境。

    是否有人知道一种更优雅的方法来确保我使用由zoneinfo环境变量指定的zoneinfo.zip文件?

    更新: 为了解决这个问题,我也从下面@chuckx的答案中得到了灵感 a Go package 这就排除了使用哪个时区数据库的猜测工作。自述文件中包括有关如何使用go安装获取时区数据库的正确版本的说明。

    1 回复  |  直到 8 年前
        1
  •  2
  •   chuckx    8 年前

    或许可以考虑不依赖环境变量?

    如果您不反对分发解压缩的文件集,那么可以很容易地使用 LoadLocationFromTZData(name string, data []byte) 是的。第二个参数是单个时区文件的内容。

    作为参考,处理zip文件的功能可以在unexported函数中找到 loadTzinfoFromZip() 是的。

    从@slotherooo的评论中提取的逐步方法:

    1. 制作本地版本的 time.loadTzinfoFromZip(zipfile, name string) ([]byte, error)
    2. 使用该方法提取 []byte 从一个 timeinfo.zip 文件
    3. 使用 time.LoadLocationFromTZData() 完全代替 time.LoadLocation