首頁 >後端開發 >Golang >為什麼在 Go 中向 UTC 時間添加 UTC 偏移量不能準確產生本地時間?

為什麼在 Go 中向 UTC 時間添加 UTC 偏移量不能準確產生本地時間?

Susan Sarandon
Susan Sarandon原創
2024-12-21 16:18:10524瀏覽

Why Does Adding a UTC Offset to UTC Time Not Accurately Produce Local Time in Go?

在Go 中將UTC 時間轉換為本地時間的問題

問題概述

當嘗試將UTC 時間轉換為本地時間時,某些使用者遇到不正確的結果。具體來說,當將根據提供的 UTC 偏移計算出的持續時間添加到當前 UTC 時間時,就會出現問題。此回傳值偏離預期的本地時間。

初始方法

程式碼片段初始化包含各國的 UTC 偏移量的地圖。它嘗試將“匈牙利”的偏移量轉換為持續時間,將其添加到 UTC 時間,並將結果顯示為“本地時間”。

package main

import "fmt"
import "time"

func main() {

    m := make(map[string]string)
    m["Hungary"] = "+01.00h"

    offSet, err := time.ParseDuration(m["Hungary"])
    if err != nil {
        panic(err)
    }
    t := time.Now().UTC().Add(offSet)
    nice := t.Format("15:04")

    fmt.Println(nice)
}

不正確的結果

執行後,程式碼會產生不正確的本地時間,特別是對於與 UTC 有偏移的國家。例如,匈牙利的時差為一小時,結果並不反映實際的當地時間。

根本原因

錯誤的結果源自於以下假設:調整後的UTC時間與當地時間相同。然而,這種假設忽略了時區的概念。

時區注意事項

時區是出於法律、商業和社會目的而遵守標準時間的地理區域。不同的時區有自己相對於 UTC 的偏移量,代表與本初子午線的時差。

正確方法

要將 UTC 時間準確轉換為特定的本地時間,必須考慮與該位置相關的時區。 time.LoadLocation 函數可讓您根據字串識別碼取得時區物件。

var countryTz = map[string]string{
    "Hungary": "Europe/Budapest",
    "Egypt":   "Africa/Cairo",
}

func timeIn(name string) time.Time {
    loc, err := time.LoadLocation(countryTz[name])
    if err != nil {
        panic(err)
    }
    return time.Now().In(loc)
}

func main() {
    utc := time.Now().UTC().Format("15:04")
    hun := timeIn("Hungary").Format("15:04")
    eg := timeIn("Egypt").Format("15:04")
    fmt.Println(utc, hun, eg)
}

此解決方案可確保轉換後的時間反映指定國家的當地時間,同時考慮相關時間區域。

以上是為什麼在 Go 中向 UTC 時間添加 UTC 偏移量不能準確產生本地時間?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn