【发布时间】:2019-01-25 10:32:20
【问题描述】:
我正在尝试为我的应用程序修改 golang 时区
我看过 time 包,初始化时区发生在
time/zoneinfo_unix.go @initLocal
该函数只是尝试读取环境变量TZ,如果它有效则加载它
如果不是,则回退到/etc/localtime,如果无效,则回退到UTC
到目前为止我已经尝试过什么
1- 工作正常 - 但我不想使用其中任何一种方法 - :
- 在我的 docker 文件中,我将一个 ENV 传递给容器,
TZ = Africa/Cairo - 进入容器 bash,运行
$ export TZ = Africa/Cairo
2-没用
- 在我的应用程序初始化中(应用程序初始化在一个单独的包中,正在导入到主程序中),我使用 os.SetEnv("TZ", "Africa/Cairo")
当我简化 main 并使用 os.SetEnv("TZ", "Africa/Cairo") 而不导入“os - time”以外的任何其他包时,它会按预期工作
关于如何使第二种方法起作用的任何想法?
Docker 镜像:golang:1.11.2
【问题讨论】:
-
在
main()中首先调用os.Setenv()似乎可行,请参见此处:play.golang.org/p/pckEDxd6p8F。 -
感谢您的回复,我试过了,它仅在您提供的示例非常简单时才有效,但在我的情况下,主要不是那么简单,它使用外部包应用初始化
-
然后把它放在主 pkg 中的
init()func 中?并且只是添加我的两个 p - 在容器中设置 env var 对我来说似乎非常好...... -
@Havelock 如果
main包导入另一个使用time包的包,这将不起作用,这将在主init()可以运行之前执行。 -
既然您指的是 docker,我猜这是一项服务而不是 CLI 工具。如果您关心默认时区是什么,请考虑存在缺陷并重新设计您的设计,使其与系统 TZ 无关。服务应该接受任何时区的输入,以 UTC 处理它们,以 UTC 存储它们,并在任何时区呈现它们。系统时区应该完全不相关。