>백엔드 개발 >Golang >UTC 시간에 UTC 오프셋을 추가하면 Go에서 현지 시간이 정확하게 생성되지 않는 이유는 무엇입니까?

UTC 시간에 UTC 오프셋을 추가하면 Go에서 현지 시간이 정확하게 생성되지 않는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-21 16:18:10520검색

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와 오프셋이 있는 국가의 경우 잘못된 현지 시간이 생성됩니다. 예를 들어, 헝가리의 1시간 오프셋을 사용하면 결과에 실제 현지 시간이 반영되지 않습니다.

근본 원인

잘못된 결과는 조정된 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)
}

이 솔루션은 변환된 시간이 관련 시간을 고려하여 지정된 국가의 현지 시간을 반영하도록 보장합니다. 존.

위 내용은 UTC 시간에 UTC 오프셋을 추가하면 Go에서 현지 시간이 정확하게 생성되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.