gpt4 book ai didi

go - 如何修复损坏的 tzdata 2020c Alpine 时区数据库?

转载 作者:行者123 更新时间:2023-12-02 11:24:26 29 4
gpt4 key购买 nike

我只是偶然发现了用于 alpine 的 tzdata2020c 包的一个错误。在 2020 年 10 月 25 日下星期日夏令时的预定更改之后,它不会计算欧洲/柏林的正确时间。版本 tzdata2020c 使用 CEST,例如2020 年 10 月 31 日和欧洲/柏林时区,而 CET 是正确的。
有谁知道如何手动添加可用的tzdata2020d 数据库的新版本here .
我用 Go 编写的应用程序在 2020 年 10 月 31 日使用 tzdata2020c 错误地将 CEST 用于欧洲/柏林:
tzdata2020c
同一应用程序在 2020 年 10 月 31 日使用 tzdata2020a 正确使用了欧洲/柏林的 CET:
tzdata2020a

最佳答案

手动安装 tzdata2020d文件本身不会解决这个问题。但是,以下内容应该(使用 golang:alpine docker 镜像成功测试):

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
其他解决方法包括:
  • 升级到 Go 1.15.41.14.11 .
  • 使用 ZONEINFO environmental variable选择不同的区域文件(例如 export ZONEINFO=/usr/local/go/lib/time/zoneinfo.zipzoneinfo.zipgo installation 中)。
  • 包括 tzdata在您的应用程序中打包(并且不要在容器中安装 tzdata - 该包仅在 time 包在系统上找不到 tzdata 文件时使用)。
  • 使用从 scratch 构建的容器(结合上述选项之一)
  • 固定较早的 alpine 版本(即 alpine:3.8)uses 2020a或更早(请注意,3.8 版已超过其 End of Support 日期)。

  • 原因
    此问题是由 zic 中的更改引起的应用;在 2020b 附带的版本之前释放这个默认为 fat正确处理应用程序的模式。现在默认为 thin并且 go 不支持该格式(没有这个 patch )。不幸的是 LoadLocation函数静默失败(返回不正确的区域信息)。
    该问题很可能发生在使用 2020b 或更高时区文件的任何地方(除非包维护者在运行 zic 时覆盖默认值)。 zic细节
    iana将时区信息分发为一系列 text files以及多个 applications .这些应用程序之一是 zic它将文本文件处理为部署到 /usr/share/zoneinfo 的二进制文件 ( RFC 8536 ) .
    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, 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))
    }
    截至 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 生成正确的结果)。

    关于go - 如何修复损坏的 tzdata 2020c Alpine 时区数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64473107/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com