gpt4 book ai didi

go - 在Golang中全局设置时区

转载 作者:行者123 更新时间:2023-12-01 22:35:36 25 4
gpt4 key购买 nike

我正在尝试为我的应用程序修改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”)

  • 当我简化主程序并使用os.SetEnv(“TZ”,“Africa / Cairo”)而不导入除“os-time”以外的任何其他软件包时,它将按预期工作

    关于如何使第二种方法起作用的任何想法吗?

    Docker镜像:golang:1.11.2

    最佳答案

    您可以使用os.Setenv("TZ", "Africa/Cairo")从应用程序内部实现所需的功能,重要的是必须在其他任何程序包使用time程序包中的任何内容之前调用此函数。

    如何保证?创建一个除了设置时区外不执行其他任何操作的程序包(以后您可以在其中添加其他内容,但是对于我们的示例来说就足够了)。

    像这样:

    package tzinit

    import (
    "os"
    )

    func init() {
    os.Setenv("TZ", "Africa/Cairo")
    }

    将此 tzinit导入main包中的第一个东西,如下所示:
    package main

    import _ "path/to/tzinit"

    // Your other, "regular" imports:
    import (
    "fmt"
    "os"
    "time"
    ...
    )

    因此,设置 TZ env var将在其他任何程序包都可以访问 time程序包之前进行。

    请注意,我只为 import使用了单独的 tzinit声明,其原因是因为许多代码编辑器/ IDE会按字母顺序重新排列导入,这将确保导入的 tzinit将保持首次导入。

    警告。

    Spec: Package initialization声明了初始化程序包的要求和规则,并且未指定导入的处理顺序(唯一可以保证的是,所有引用的程序包将在使用之前递归地初始化)。这意味着,尽管当前的编译器按列出的方式处理它们,但您不能100%依靠它。即使对于 main包,也存在多个源文件的问题,以不同的顺序提供给编译器也可能会更改初始化顺序。规范将其作为“建议”:

    为了确保可重现的初始化行为,鼓励构建系统以词法文件名的顺序向编译器提供属于同一软件包的多个文件。

    为了安全起见,最好在启动Go应用之前设置 TZ环境变量。

    关于go - 在Golang中全局设置时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63633606/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com