如何解决如何修复阿尔卑斯山破碎的tzdata2020c时区数据库?
我偶然发现了tzdata2020c高山软件包的一个错误。计划在2020年10月25日下一个星期日更改夏令时之后,它不会计算欧洲/柏林的正确时间。版本tzdata2020c使用CEST作为示例。 2020年10月31日和欧洲/柏林时区,而CET是正确的。
有人知道如何手动添加here可用的tzdata2020d数据库的新版本。
我的应用(用Go语言编写)在2020年10月31日使用tzdata2020c错误地使用了CEST for Europe / Berlin:
同一应用程序使用tzdata2020a在2020年10月31日正确使用了欧洲/柏林的CET:
解决方法
手动安装tzdata2020d
文件本身不能解决此问题。但是,以下内容(应使用golang:alpine
码头工人映像进行成功测试):
mkdir tz
cd tz
wget https://www.iana.org/time-zones/repository/releases/tzdata2020d.tar.gz
tar -xvf tzdata2020d.tar.gz
zic -b fat -d zoneinfo/ europe
cp zoneinfo/Europe/Berlin /usr/share/zoneinfo/Europe/Berlin
其他解决方法包括:
- 升级到1.15.4或1.14.11。
- 使用
ZONEINFO
environmental variable选择其他区域文件(例如export ZONEINFO=/usr/local/go/lib/time/zoneinfo.zip
;zoneinfo.zip
在go installation中)。 - 在您的应用程序中包含tzdata软件包(并且不要在容器中安装tzdata-仅当时间软件包在系统上找不到tzdata文件时才使用该软件包)。
- 使用从scratch构建的容器(结合以上选项之一)
- 固定一个uses 2020a或更早的高山版本(即alpine:3.8)(请注意,版本3.8已超过其End of Support日期)。
原因
此问题是由zic
应用程序中的更改引起的;在2020b附带的版本之前,此默认设置为fat
模式,可以正确处理应用程序。现在的默认值为thin
,并且go不支持该格式(没有patch)。不幸的是LoadLocation
函数会静默失败(返回错误的区域信息)。
无论何时使用2020b或更高时区文件,都可能发生此问题(除非程序包维护程序在运行zic
时覆盖默认设置)。
zic
详细信息
iana将时区信息与一系列text files一起分发为一系列applications。这些应用程序之一是zic
,它可以将文本文件处理为二进制文件(RFC 8536),然后将其部署到/usr/share/zoneinfo
。
This commit将默认输出格式从fat
更改为slim
。这样做的结果是,使用2020b或更高版本生成的时区文件将无法被Go正确读取(除非使用-b fat
参数创建了时区文件)。
修复
提出了一个issue,该问题部分由最近的commit解决了(该提交的主要目的是减小time/tzdata
包的大小,但也应该解决这个)。请参见this issue,此修复程序的另一部分。
测试
以下应用程序演示了该问题:
package main
import (
"fmt"
"time"
)
func main() {
b,err := time.LoadLocation("Europe/Berlin")
if err != nil {
panic(err)
}
t := time.Date(2020,10,23,11,00,time.UTC)
fmt.Printf("1: %s %s\n",t,t.In(b))
t = time.Date(2020,31,time.UTC)
fmt.Printf("2: %s %s\n",t.In(b))
}
截至10月19日的输出(在Docker下为Alpine 3.12)为:
1: 2020-10-23 11:00:00 +0000 UTC 2020-10-23 13:00:00 +0200 CEST
2: 2020-10-31 11:00:00 +0000 UTC 2020-10-31 13:00:00 +0200 CEST
这是不正确的,因为第31位应为CET
(Alpine 3.8会生成正确的结果)。
在alpine:3.9图片上也发生了同样的问题,并根据Brit的回答设法解决了该问题。谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。