Rumah >pembangunan bahagian belakang >Golang >Mengapakah `time.Parse` Go Gagal Menghuraikan Zon Masa dengan Tepat, dan Bagaimanakah Ini Boleh Dibetulkan?

Mengapakah `time.Parse` Go Gagal Menghuraikan Zon Masa dengan Tepat, dan Bagaimanakah Ini Boleh Dibetulkan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-27 17:55:11366semak imbas

Why Does Go's `time.Parse` Fail to Accurately Parse Time Zones, and How Can This Be Fixed?

Memahami Penghuraian Zon Waktu dalam Go

Menghuraikan kod zon waktu dalam Go melibatkan penukaran perwakilan rentetan zon waktu kepada *masa yang sepadan .Objek lokasi. Walau bagaimanapun, dalam senario tertentu, hasil yang dihuraikan mungkin tidak menggambarkan zon waktu yang dikehendaki dengan tepat. Artikel ini meneroka isu biasa dalam penghuraian zon waktu dan menyediakan penyelesaian.

Perumusan Masalah

Pertimbangkan kod berikut:

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    parseAndPrint(now, "BRT")
    parseAndPrint(now, "EDT")
    parseAndPrint(now, "UTC")
}

func parseAndPrint(now time.Time, timezone string) {
    test, err := time.Parse("15:04:05 MST", fmt.Sprintf("05:00:00 %s", timezone))
    if err != nil {
        fmt.Println(err)
        return
    }

    test = time.Date(
        now.Year(),
        now.Month(),
        now.Day(),
        test.Hour(),
        test.Minute(),
        test.Second(),
        test.Nanosecond(),
        test.Location(),
    )

    fmt.Println(test.UTC())
}

Apabila berjalan kod ini, output sentiasa menunjukkan "[tarikh] 05:00:00 0000 UTC", tanpa mengira masa yang ditentukan zon. Ini kerana kod sedang menghuraikan masa di lokasi semasa dan kemudian menetapkan zon waktu secara eksplisit kepada UTC.

Penyelesaian: Menggunakan masa.Lokasi

Untuk mengendalikan dengan betul penghuraian zon waktu, kita perlu menggunakan jenis *masa.Lokasi. Kami boleh memuatkan lokasi daripada pangkalan data zon waktu tempatan menggunakan masa.LoadLocation dan kemudian menghuraikan masa menggunakan masa.ParseInLocation. Berikut ialah kod yang diubah suai:

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    parseAndPrint(now, "BRT")
    parseAndPrint(now, "EDT")
    parseAndPrint(now, "UTC")
}

func parseAndPrint(now time.Time, timezone string) {
    location, err := time.LoadLocation(timezone)
    if err != nil {
        fmt.Println(err)
        return
    }

    test, err := time.ParseInLocation("15:04:05 MST", "05:00:00", location)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(test)
}

Kini, kod akan menghuraikan masa khusus zon waktu dengan betul dan mencetak hasilnya dalam format zon waktu yang diingini.

Atas ialah kandungan terperinci Mengapakah `time.Parse` Go Gagal Menghuraikan Zon Masa dengan Tepat, dan Bagaimanakah Ini Boleh Dibetulkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn