【问题标题】:Detect if ZONEINFO fails in Go检测 ZONEINFO 在 Go 中是否失败
【发布时间】:2018-12-05 18:59:05
【问题描述】:

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

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

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

  1. 我可以检查自己是否设置了环境变量,但这充其量只是部分解决方案,因为它不会告诉我文件是否可以被 LoadLocation 实际使用。
  2. 我可以确保不存在区域信息的备份位置。这似乎有点极端,意味着我必须非常小心代码在开发和生产设置中运行的环境。

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

更新:为了解决这个问题,我也从下面@chuckx 的回答中获得灵感,并将a Go package 放在一起,从而消除了使用哪个时区数据库的猜测工作。自述文件中包含有关如何使用 Go 安装获取正确版本的时区数据库的说明。

【问题讨论】:

    标签: go timezone zoneinfo


    【解决方案1】:

    也许考虑不依赖环境变量?

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

    作为参考,处理压缩文件的功能可以在未导出的函数loadTzinfoFromZip()中找到。

    从@Slotherooo 的评论中提取的分步方法:

    1. 制作本地版本的time.loadTzinfoFromZip(zipfile, name string) ([]byte, error)
    2. 使用该方法从timeinfo.zip 文件中提取所需位置的[]byte
    3. 独占使用time.LoadLocationFromTZData() 而不是time.LoadLocation

    【讨论】:

    • 谢谢@chuckx。让我整理一下我对提议的解决方案的理解,看看我是否理解正确。 1. 制作我可以使用的本地版本 loadTzinfoFromZip,因为此方法未导出 2. 使用该方法获取我想要使用的版本的 timeinfo.zip 文件的 [] 字节 3. 在我的代码中专门使用 LoadLocationFromTZData而不是 LoadLocation
    • 听起来不错。将步骤提取到答案中。
    • 谢谢。我会尝试并报告。
    • 事实证明,从 zip 文件中获取正确的字节是一件非常痛苦的事情,因此我采用了一种提取 zip 的策略,然后从正确的文件中获取字节变得更加容易时区文件。我为此创建了一个存储库,我将从我的问题中链接到它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    相关资源
    最近更新 更多