Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menyahmarshal Rentetan Datetime yang Diformat dengan Salah dalam Go?

Bagaimana untuk Menyahmarshal Rentetan Datetime yang Diformat dengan Salah dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-04 18:17:01283semak imbas

How to Unmarshal Incorrectly Formatted Datetime Strings in Go?

Unmarshal Salah Format Datetime

Latar Belakang

Apabila cuba menghuraikan rentetan datetime dalam Go menggunakan masa. Parse, ia boleh gagal jika offset zon waktu tidak diformat dengan betul. Khususnya, jika ofset dinyatakan sebagai " 0200" dan bukannya " 02:00", seperti yang dikehendaki oleh RFC3339.

Soalan

Diberikan satu set fail JSON yang mengandungi datetimes dengan format offset yang salah, bagaimanakah kita boleh menyahmarshalnya dengan betul dalam Go tanpa mengubah format datetimes yang disusun semula kepada JSON?

Jawapan

Masa Tersuai Medan

Untuk mengendalikan kedua-dua format ofset yang sah dan tidak sah, kami boleh menentukan jenis medan masa tersuai kami sendiri. Ini membolehkan kami mengatasi kelakuan unmarshal lalai dan menghuraikan rentetan datetime secara manual mengikut salah satu daripada dua format yang dijangkakan.

Contoh Pelaksanaan

<code class="go">type MyTime struct {
    time.Time
}

func (self *MyTime) UnmarshalJSON(b []byte) (err error) {
    s := string(b)

    // Remove quotes from JSON string (optional)
    s = s[1:len(s)-1]

    t, err := time.Parse(time.RFC3339Nano, s)
    if err != nil {
        t, err = time.Parse("2006-01-02T15:04:05.999999999Z0700", s)
    }
    self.Time = t
    return
}

type Test struct {
    Time MyTime `json:"time"`
}</code>

Dalam contoh ini , kami menggunakan kaedah UnmarshalJSON untuk mengatasi tingkah laku unmarshaling lalai. Kami mula-mula mengalih keluar sebarang petikan yang disertakan di sekitar rentetan datetime dan kemudian cuba menghuraikannya menggunakan format masa standard.RFC3339Nano. Jika itu gagal, kami cuba menghuraikan format yang salah ("2006-01-02T15:04:05.999999999Z0700") juga.

Format RFC3339Nano dalam Metadata JSON

Untuk menentukan penggunaan format RFC3339Nano untuk medan masa tersuai dalam JSON, kami hanya boleh menggunakan rentetan format yang sama seperti dalam kaedah UnmarshalJSON:
<code class="go">type Test struct {
    Time MyTime `json:"time,omitempty"`
}</code>

Ini menunjukkan bahawa medan masa akan diwakili dalam JSON sebagai rentetan dalam format RFC3339Nano. Apabila menyusun kembali ke JSON, kaedah MarshalJSON yang ditindih bagi jenis MyTime akan digunakan untuk memastikan format yang betul dikekalkan.

Atas ialah kandungan terperinci Bagaimana untuk Menyahmarshal Rentetan Datetime yang Diformat dengan Salah dalam Go?. 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