4 回答

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
您可以使用從您的應(yīng)用程序內(nèi)部實(shí)現(xiàn)您想要的os.Setenv("TZ", "Africa/Cairo"),重要的是您必須在任何其他包使用time包中的任何內(nèi)容之前調(diào)用它。
如何確保?創(chuàng)建一個(gè)除了設(shè)置時(shí)區(qū)之外什么都不做的包(稍后你可以向它添加其他東西,但對于我們的例子來說這就足夠了)。
像這樣:
package tzinit
import (
? ? "os"
)
func init() {
? ? os.Setenv("TZ", "Africa/Cairo")
}
首先在你的包中導(dǎo)入這個(gè)tzinit包,如下所示:main
package main
import _ "path/to/tzinit"
// Your other, "regular" imports:
import (
? ? "fmt"
? ? "os"
? ? "time"
? ? ...
)
因此設(shè)置TZenv var 將在任何其他包可以訪問該包之前發(fā)生time。
請注意,我import為 單獨(dú)使用了一個(gè)聲明tzinit,這是因?yàn)樵S多代碼編輯器/IDE 會按字母順序重新排列您的導(dǎo)入,這將確保導(dǎo)入tzinit將保持第一個(gè)導(dǎo)入。
一句警告。
Spec?: Package initialization聲明了初始化包的要求和規(guī)則,并沒有指定處理導(dǎo)入的順序(唯一保證的是所有引用的包在使用之前都會被遞歸初始化)。這意味著盡管當(dāng)前的編譯器按照列出的方式處理它們,但您不能 100% 依賴它。還有一個(gè)問題,即使是main
包也有多個(gè)源文件,以不同的順序向編譯器提供它們也可能會改變初始化順序。該規(guī)范將此作為“建議”:
為了確??芍噩F(xiàn)的初始化行為,鼓勵(lì)構(gòu)建系統(tǒng)以詞法文件名順序向編譯器呈現(xiàn)屬于同一包的多個(gè)文件。
所以為了安全起見,最好TZ在啟動 Go 應(yīng)用程序之前設(shè)置環(huán)境變量。

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
在這里為偶然發(fā)現(xiàn)此頁面的人添加我的答案。包中有一個(gè)全局變量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
}
您的系統(tǒng)必須安裝時(shí)區(qū)數(shù)據(jù)庫。在 docker 中,你必須 apt get/apk add tzdata。但是如果你使用的是go1.15,你也可以嵌入時(shí)區(qū)數(shù)據(jù)庫而無需tzdata在系統(tǒng)上安裝。
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
}

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
我可能會遲到,但在全球環(huán)境中設(shè)置時(shí)區(qū)并不是一種可靠的方法。它應(yīng)該在變量或結(jié)構(gòu)中全局設(shè)置。下面是在變量中設(shè)置時(shí)區(qū)的示例。也在圍棋游樂場
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)
}

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
請注意,如果您想在 AWS 上部署您的應(yīng)用程序,time.LoadLocation
可能會返回錯(cuò)誤,因?yàn)樗也坏綌?shù)據(jù)庫文件。從文檔:
LoadLocation 按順序在以下位置查找 IANA 時(shí)區(qū)數(shù)據(jù)庫:
由 ZONEINFO 環(huán)境變量命名的目錄或未壓縮的 zip 文件
在 Unix 系統(tǒng)上,系統(tǒng)標(biāo)準(zhǔn)安裝位置
$GOROOT/lib/time/zoneinfo.zip
time/tzdata 包,如果它是導(dǎo)入的
您應(yīng)該導(dǎo)入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
}
- 4 回答
- 0 關(guān)注
- 511 瀏覽
添加回答
舉報(bào)