好好爱自己!

【转】Golang使用时区时候报错

 

转:https://www.itlangzi.com/s/1526209468730183680.html

-------------------------------------

Golang使用时区时候报错

错误1:

panic: The system cannot find the path specified.

错误2:

panic: unknown time zone Asia/Shanghai

原因

  1. 使用docker镜像缺少相关时区文件
  2. 使用-trimpath参数后报错
  3. 缺少zoneinfo.zip文件

解决方案

方案一

在入口添加导入语句

优点:基本能解决以上所有的问题,一劳永逸
缺点:打包会引入超1.3MB的文件

import _ "time/tzdata"

方案二

针对docker镜像,加入以下命令:

本文并未尝试, 资料来源与网络, 详见: https://stackoverflow.com/questions/59044243/timezones-failing-to-load-in-go-1-13
该方案使用的镜像是alpine

1. 命令一

注意最新的alpine镜像已不支持tzdata, 参考 https://github.com/dotnet/dotnet-docker/issues/1366

RUN apk add --no-cache tzdata

2. 命令二

COPY ./zoneinfo.zip /usr/local/go/lib/time/zoneinfo.zip

以上命令二选其一即可 命令二需要提供zoneinfo.zip文件,zoneinfo.zip获取见附录

方案三

1. 入口直接加载zoneinfo.zip文件

在入口直接载入zoneinfo.zip文件;示例如下

func main() {
    loadZoneinfo()
    // 其他业务代码
}
func loadZoneinfo(){
   err := syscall.Setenv("ZONEINFO", `./zoneinfo.zip`)
    if err != nil {
        log.Fatal(err)
    }
}

ZONEINFO 为环境变量名,不能更改

2. 将zoneinfo.zip文件复制到对应目录

类似方案二中的命令二方式

cp ./zoneinfo.zip /usr/local/go/lib/time/zoneinfo.zip

附录

zoneinfo.zip默认是在$GOROOT/lib/time/zoneinfo.zip

  • windows默认在C:\Program Files\Go\lib\time\zoneinfo.zip
  • Linux默认在/usr/local/go/lib/time/zoneinfo.zip

作者: Ababa
版权声明: 本博客所有文章除特別声明外, 均采用 CC BY 4.0 许可协议。转载请注明来源 IT浪子D博客 !
posted @ 2026-02-04 11:02  立志做一个好的程序员  阅读(2)  评论(0)    收藏  举报

不断学习创作,与自己快乐相处