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
其他解決方法包括:
使用
ZONEINFO
環境變量選擇不同的區域文件(例如export ZONEINFO=/usr/local/go/lib/time/zoneinfo.zip
;zoneinfo.zip
在go 安裝中)。在您的應用程序中包含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
) 。
此提交將默認輸出格式從 更改fat
為slim
。這樣做的結果是,使用 2020b 或更高版本生成的時區文件將無法被 Go 正確讀?。ǔ撬鼈兪鞘褂?code>-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))
}
截至 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 生成正確的結果)。
- 2 回答
- 0 關注
- 211 瀏覽
添加回答
舉報