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
Lepaskan: 2024-11-27 17:55:11
asal
387 orang telah melayarinya

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())
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan