亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在golang中全局設置時區

在golang中全局設置時區

Go
米脂 2023-06-01 18:12:51
我正在嘗試為我的應用程序修改 golang 時區我看了一下時間包,初始化時區發生在時間/zoneinfo_unix.go @initLocal該函數只是嘗試讀取環境變量TZ,如果有效則加載它如果不是,它會回落/etc/localtime,如果它無效,它會回落到UTC到目前為止我已經嘗試過1- 工作正常 - 但我不想使用這些方法中的任何一種 - :在我的 docker 文件中,我將 ENV 傳遞給容器,TZ = Africa/Cairo進入容器 bash,運行$ export TZ = Africa/Cairo2-沒用在我的應用程序初始化中(應用程序初始化在一個單獨的包中,正在主導入),我使用 os.SetEnv("TZ", "Africa/Cairo")當我簡化 main 并使用 os.SetEnv("TZ", "Africa/Cairo") 而不導入除“os - time”之外的任何其他包時,它按預期工作關于如何使第二種方法起作用的任何想法?Docker 鏡像:golang:1.11.2
查看完整描述

4 回答

?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

您可以使用從您的應用程序內部實現您想要的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包也有多個源文件,以不同的順序向編譯器提供它們也可能會改變初始化順序。該規范將此作為“建議”:

為了確??芍噩F的初始化行為,鼓勵構建系統以詞法文件名順序向編譯器呈現屬于同一包的多個文件。


所以為了安全起見,最好TZ在啟動 Go 應用程序之前設置環境變量。


查看完整回答
反對 回復 2023-06-01
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

在這里為偶然發現此頁面的人添加我的答案。包中有一個全局變量time,像這樣使用它main.go


package main


import "time"


func main() {

    loc, err := time.LoadLocation("Africa/Cairo")

    // handle err

    time.Local = loc // -> this is setting the global timezone

}

您的系統必須安裝時區數據庫。在 docker 中,你必須 apt get/apk add tzdata。但是如果你使用的是go1.15,你也可以嵌入時區數據庫而無需tzdata在系統上安裝。


package main


import (

    "time"

    _ "time/tzdata"

)


func main() {

    loc, err := time.LoadLocation("Africa/Cairo")

    // handle err

    time.Local = loc // -> this is setting the global timezone

}


查看完整回答
反對 回復 2023-06-01
?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

我可能會遲到,但在全球環境中設置時區并不是一種可靠的方法。它應該在變量或結構中全局設置。下面是在變量中設置時區的示例。也在圍棋游樂場

package main


import (

    "fmt"

    "log"

    "time"

)


func main() {

    if err := setTimezone("America/Los_Angeles"); err != nil {

        log.Fatal(err) // most likely timezone not loaded in Docker OS

    }

    t := getTime(time.Now())

    fmt.Println(t)

}


var loc *time.Location


func setTimezone(tz string) error {

    location, err := time.LoadLocation(tz)

    if err != nil {

        return err

    }

    loc = location

    return nil

}


func getTime(t time.Time) time.Time {

    return t.In(loc)

}


查看完整回答
反對 回復 2023-06-01
?
SMILET

TA貢獻1796條經驗 獲得超4個贊

請注意,如果您想在 AWS 上部署您的應用程序,time.LoadLocation可能會返回錯誤,因為它找不到數據庫文件。從文檔:

LoadLocation 按順序在以下位置查找 IANA 時區數據庫:

  • 由 ZONEINFO 環境變量命名的目錄或未壓縮的 zip 文件

  • 在 Unix 系統上,系統標準安裝位置

  • $GOROOT/lib/time/zoneinfo.zip

  • time/tzdata 包,如果它是導入的

您應該導入time/tzdata包來解決問題:

import _ "time/tzdata" // Important!


func main() {

    location, err := time.LoadLocation("Europe/Berlin")

    if err != nil {

        log.Fatal().Msgf("Err loading location: %v", err)

    }

    time.Local = location

}


查看完整回答
反對 回復 2023-06-01
  • 4 回答
  • 0 關注
  • 512 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號