登录
首页 >  Golang >  Go问答

浅析golang中怎么全局设置时区

来源:Golang技术栈

时间:2023-03-23 13:19:25 296浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《浅析golang中怎么全局设置时区》就很适合你!本篇内容主要包括浅析golang中怎么全局设置时区,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我正在尝试为我的应用程序修改 golang 时区

我看了看 时间 包,初始化时区发生在

时间/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"
    ...
)

因此设置TZenv var 将在任何其他包可以访问该time包之前发生。

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

一句警告。

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

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

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

本篇关于《浅析golang中怎么全局设置时区》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表