問題の概要
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 中国語 Web サイトの他の関連記事を参照してください。