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 應用程序之前設置環境變量。

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
}

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)
}

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
}
- 4 回答
- 0 關注
- 512 瀏覽
添加回答
舉報