微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何修复阿尔卑斯山破碎的tzdata2020c时区数据库?

如何解决如何修复阿尔卑斯山破碎的tzdata2020c时区数据库?

我偶然发现了tzdata2020c高山软件包的一个错误。计划在2020年10月25日下一个星期日更改夏令时之后,它不会计算欧洲/柏林的正确时间。版本tzdata2020c使用CEST作为示例。 2020年10月31日和欧洲/柏林时区,而CET是正确的。

有人知道如何手动添加here可用的tzdata2020d数据库的新版本。

我的应用(用Go语言编写)在2020年10月31日使用tzdata2020c错误地使用了CEST for Europe / Berlin:

tzdata2020c

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

tzdata2020a

解决方法

手动安装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.41.14.11
  • 使用ZONEINFO environmental variable选择其他区域文件(例如export ZONEINFO=/usr/local/go/lib/time/zoneinfo.zipzoneinfo.zipgo 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参数创建了时区文件)。

修复

在Go 1.15.41.14.11中已解决。

提出了一个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 举报,一经查实,本站将立刻删除。