前提

1、docker 空镜像(或类似环境)

2、Go 应用中 使用了 loc, _ := time.LoadLocation("Asia/Chongqing")

问题

$ go run ./xxx

panic: time:missing Location in call to Time.In

原因

时间的位置信息是从本地文件系统中提取的,大多数系统都支持它,但还是取决于当前系统。具体的配置存储路径:

$ cd /usr/share/zoneinfo

进入该目录就可以看到各时区的配置信息

$ ls
+VERSION    Australia   EET         Factory     Greenwich   Jamaica     Mexico      Poland      US          posixrules
Africa      Brazil      EST         GB          HST         Japan       NZ          Portugal    UTC         zone.tab
America     CET         EST5EDT     GB-Eire     Hongkong    Kwajalein   NZ-CHAT     ROC         Universal
Antarctica  CST6CDT     Egypt       GMT         Iceland     Libya       Navajo      ROK         W-SU
Arctic      Canada      Eire        GMT+0       Indian      MET         PRC         Singapore   WET
Asia        Chile       Etc         GMT-0       Iran        MST         PST8PDT     Turkey      Zulu
Atlantic    Cuba        Europe      GMT0        Israel      MST7MDT     Pacific     UCT         iso3166.tab

但在空镜像(或类似的场景)中就不存在这些时区配置文件,程序引用时就会出现这个报错

(准确来说,出现这个问题是因为本地系统不存在 Asia/Chongqing 的时区配置文件)

解决

安装

$ apk add --no-cache tzdata

安装这个包后,会在 /usr/share/zoneinfo 目录下生成各时区的配置信息

注意,如果没有 timezone 、locatime 的配置,需要手动处理一下

最后

你知道 tzdata 是什么吗?简单来讲,它是时区数据库(作为文件和模块)

这个软件包的目的是将标准时区数据库分布在 cabal 软件包中,以便它可以在所有平台上统一用于 Haskell 程序


煎鱼
8.4k 声望12.8k 粉丝