go - 检测 ZONEINFO 在 Go 中是否失败
问题描述
在 Go 中,您可以通过添加指向您要用于时区信息的特定文件的 ZONEINFO 环境变量来指定要使用的特定 zoneinfo.zip 文件。这很棒,因为它允许我确保我在前端和后端使用的 IANA 时区数据库的版本是相同的。
但是,似乎没有任何方法可以检测指定区域信息文件的使用是否失败。查看源代码(https://golang.org/src/time/zoneinfo.go),看起来使用指定文件的任何错误都会安静地失败,然后 go 将继续检查默认操作系统位置或默认 $ GOROOT 位置从那里提取时区信息。这不是我想要的行为,因为我想确定我正在使用我指定的区域信息版本。
我在解决方案方面考虑了以下内容,但我对其中任何一个都不满意。
- 我可以检查自己是否设置了环境变量,但这充其量只是一个部分解决方案,因为它没有告诉我文件是否真的可以被 LoadLocation 使用。
- 我可以确保不存在任何区域信息的备份位置。这似乎有点极端,意味着我必须非常小心代码在开发和生产设置中运行的环境。
有谁知道一种更优雅的方法来确保我使用由我的 ZONEINFO 环境变量指定的 zoneinfo.zip 文件?
更新:为了解决这个问题,我也从下面@chuckx 的答案中获得灵感,并整理了一个 Go 包,该包可以从使用哪个时区数据库中进行猜测工作。自述文件中包含有关如何使用 Go 安装获取正确版本的时区数据库的说明。
解决方案
也许考虑不依赖环境变量?
如果您不反对分发解压缩的文件集,您可以轻松使用LoadLocationFromTZData(name string, data []byte)
. 第二个参数是单个时区文件的内容。
作为参考,处理 zip 文件的功能可在 unexported function 中找到loadTzinfoFromZip()
。
从@Slotherooo 的评论中提取的分步方法:
- 制作本地版本
time.loadTzinfoFromZip(zipfile, name string) ([]byte, error)
- 使用该方法从文件中提取
[]byte
所需位置timeinfo.zip
time.LoadLocationFromTZData()
专门使用而不是time.LoadLocation
推荐阅读
- arrays - Get-WMIObject Win32_NetworkAdapterConfiguration - 循环通过每个 NIC 的 X 个 DNS 服务器
- sql - 当我进行连接时,pgAdmin 4 不返回行
- c++ - C++ alignas(1) 不影响结构的大小
- php - PHP 7“不能使用字符串偏移作为数组”
- python-3.x - 将第 1 行提升为列标题 - Spark DataFrame
- javascript - 使用带有 copy 和 pg-query-stream 的占位符
- excel - Excel:突出显示在其他列中具有最大值和最小值的行
- android-studio - 无法解析符号“onCompleteListener”
- sql - 使用 jackc/pgx 将空字符串或 null 作为 null 插入 postgres
- date - 有没有办法计算 dax / powerbi 中两个日期(第一个和最后一个)之间的差异?