tam*_*abe 5 go alpine-linux tzdata
我只是偶然发现了用于 alpine 的 tzdata2020c 包的一个错误。在 2020 年 10 月 25 日下星期日的夏令时计划更改后,它不会计算欧洲/柏林的正确时间。 tzdata2020c 版本使用 CEST,例如 2020 年 10 月 31 日和欧洲/柏林时区,而 CET 是正确的。
有谁知道如何手动添加新版本的 tzdata2020d 数据库,该数据库可在此处获得。
我用 Go 编写的应用程序在 2020 年 10 月 31 日使用 tzdata2020c 错误地将 CEST 用于欧洲/柏林:

同一应用程序在 2020 年 10 月 31 日使用 tzdata2020a 正确使用了欧洲/柏林的 CET:

手动安装tzdata2020d文件本身并不能解决此问题。但是,应该执行以下操作(已使用golang:alpinedocker 映像成功测试):
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
Run Code Online (Sandbox Code Playgroud)
其他解决方法包括:
ZONEINFO 环境变量选择不同的区域文件(例如export ZONEINFO=/usr/local/go/lib/time/zoneinfo.zip,zoneinfo.zip位于go 安装中)。此问题是由应用程序的更改引起的zic;在2020b版本中包含的版本之前,默认为fat正确处理 go 应用程序的模式。默认是 nowthin并且 go 不支持该格式(没有这个补丁)。不幸的是,该LoadLocation函数默默地失败了(返回不正确的区域信息)。
只要使用 2020b 或更高版本的时区文件,就有可能出现此问题(除非包维护者在运行时覆盖默认值zic)。
zic细节iana将时区信息作为一系列文本文件与许多应用程序一起分发。这些应用程序之一是zic将文本文件处理为部署到的二进制文件 ( RFC 8536/usr/share/zoneinfo ) 。
此提交将默认输出格式从 更改fat为slim. 这样做的结果是,Go 将无法正确读取使用 2020b 或更高版本生成的时区文件(除非它们是使用参数创建的-b fat)。
已经提出了一个问题,并且该问题已通过最近的提交部分解决(该提交的主要目的是减少time/tzdata包的大小,但也应该解决这个问题)。请参阅此问题的修复的其他部分。
以下应用程序演示了该问题:
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, 00, 00, time.UTC)
fmt.Printf("1: %s %s\n", t, t.In(b))
t = time.Date(2020, 10, 31, 11, 00, 00, 00, time.UTC)
fmt.Printf("2: %s %s\n", t, t.In(b))
}
Run Code Online (Sandbox Code Playgroud)
截至 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
Run Code Online (Sandbox Code Playgroud)
这是不正确的,因为应该是第 31 个CET(Alpine 3.8 生成正确的结果)。