亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何修復損壞的 tzdata2020c 高山時區數據庫?

如何修復損壞的 tzdata2020c 高山時區數據庫?

Go
泛舟湖上清波郎朗 2022-07-11 14:58:56
我剛剛偶然發現了 tzdata2020c 高山軟件包的一個錯誤。在 2020 年 10 月 25 日下周日計劃更改夏令時后,它不會計算歐洲/柏林的正確時間。版本 tzdata2020c 使用 CEST,例如 2020 年 10 月 31 日和歐洲/柏林時區,而 CET 是正確的。 有人知道如何手動添加新版本的 tzdata2020d 數據庫,該數據庫可在此處獲得。我用 Go 編寫的應用程序在 2020 年 10 月 31 日使用 tzdata2020c 錯誤地使用了歐洲/柏林的 CEST:同一應用程序在 2020 年 10 月 31 日使用 tzdata2020a 正確使用了歐洲/柏林的 CET:
查看完整描述

2 回答

?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

手動安裝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

其他解決方法包括:

  • 升級到 Go 1.15.41.14.11。

  • 使用ZONEINFO 環境變量選擇不同的區域文件(例如export ZONEINFO=/usr/local/go/lib/time/zoneinfo.zip;zoneinfo.zipgo 安裝中)。

  • 在您的應用程序中包含tzdata包(并且不要在容器中安裝 tzdata - 該包僅在時間包無法在系統上找到 tzdata 文件時使用)。

  • 使用從頭開始構建的容器(結合上述選項之一)

  • 固定使用 2020a或更早版本的早期 alpine 版本(即 alpine:3.8)(請注意,版本 3.8 已超過其支持結束日期)。

原因

此問題是由應用程序更改引起的zic;在2020b版本中包含的版本之前,此默認設置為fat正確處理應用程序的模式。默認是 nowthin并且 go 不支持該格式(沒有這個補丁)。不幸的是,該LoadLocation功能靜默失?。ǚ祷夭徽_的區域信息)。

無論何時使用 2020b 或更高版本的時區文件,都可能出現此問題(除非包維護者在運行時覆蓋了默認值zic)。

zic細節

iana將時區信息作為一系列文本文件與許多應用程序一起分發。這些應用程序之一是zic將文本文件處理為部署到的二進制文件 ( RFC 8536/usr/share/zoneinfo ) 。

此提交將默認輸出格式從 更改fatslim。這樣做的結果是,使用 2020b 或更高版本生成的時區文件將無法被 Go 正確讀?。ǔ撬鼈兪鞘褂?code>-b fat參數創建的)。

去修復

這在 Go 1.15.41.14.11中已修復。

已經提出了一個問題,該問題已通過最近的一次提交部分修復(該提交的主要目的是減小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))

}

截至 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 生成正確的結果)。


查看完整回答
反對 回復 2022-07-11
?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

在 alpine:3.9 圖像上遇到了同樣的問題,并根據英國人的回答設法修復了它。謝謝。



查看完整回答
反對 回復 2022-07-11
  • 2 回答
  • 0 關注
  • 211 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號