在 Go 语言开发中,处理时间(time.Time)类型的 JSON 序列化和反序列化是一个常见但容易出错的问题。很多初学者在使用 encoding/json 包时会发现,时间字段被自动转换成 ISO 8601 格式的字符串,但在某些业务场景下,我们需要自定义时间格式,比如 "2024-05-20 12:00:00" 或 Unix 时间戳。本文将手把手教你如何优雅地处理 Go语言时间序列化,让你轻松掌握 encoding/json时间处理 的核心技巧。

Go 的 encoding/json 包对 time.Time 类型有内置支持。当你对包含时间字段的结构体进行 JSON 编码时,它会自动使用 RFC3339 格式(即 ISO 8601 的一种变体)进行序列化。
package mainimport ( "encoding/json" "fmt" "time")type Event struct { Name string `json:"name"` Time time.Time `json:"time"`}func main() { event := Event{ Name: "会议", Time: time.Date(2024, 5, 20, 14, 30, 0, 0, time.UTC), } data, _ := json.Marshal(event) fmt.Println(string(data)) // 输出: {"name":"会议","time":"2024-05-20T14:30:00Z"}}可以看到,默认输出是 2024-05-20T14:30:00Z,这种格式虽然标准,但可能不符合前端或 API 接口要求。
要实现自定义的 JSON时间格式化,我们可以创建一个自定义时间类型,并实现 MarshalJSON 和 UnmarshalJSON 方法。
package mainimport ( "encoding/json" "fmt" "time")const TimeFormat = "2006-01-02 15:04:05"type CustomTime struct { time.Time}// MarshalJSON 自定义序列化func (ct CustomTime) MarshalJSON() ([]byte, error) { if ct.Time.IsZero() { return []byte("null"), nil } return []byte(`"` + ct.Time.Format(TimeFormat) + `"`), nil}// UnmarshalJSON 自定义反序列化func (ct *CustomTime) UnmarshalJSON(data []byte) error { if string(data) == "null" { return nil } t, err := time.ParseInLocation(`"`+TimeFormat+`"`, string(data), time.Local) if err != nil { return err } ct.Time = t return nil}type Event struct { Name string `json:"name"` Time CustomTime `json:"time"`}func main() { event := Event{ Name: "项目上线", Time: CustomTime{time.Date(2024, 6, 1, 10, 0, 0, 0, time.Local)}, } // 序列化 data, _ := json.Marshal(event) fmt.Println(string(data)) // 输出: {"name":"项目上线","time":"2024-06-01 10:00:00"} // 反序列化 var newEvent Event json.Unmarshal(data, &newEvent) fmt.Printf("解析后的时间: %v\n", newEvent.Time.Format(TimeFormat))}通过这种方式,你可以完全控制时间在 JSON 中的表现形式,非常适合需要与前端或其他系统对接的场景。
有些 API 要求时间以 Unix 时间戳(秒或毫秒)形式传输。这时也可以通过自定义类型实现:
type TimestampTime struct { time.Time}func (tt TimestampTime) MarshalJSON() ([]byte, error) { return []byte(fmt.Sprintf("%d", tt.Unix())), nil}func (tt *TimestampTime) UnmarshalJSON(data []byte) error { var timestamp int64 if err := json.Unmarshal(data, ×tamp); err != nil { return err } tt.Time = time.Unix(timestamp, 0) return nil}IsZero()),避免输出无效时间。time.Local)。通过本文,你已经掌握了在 Go 语言中使用 encoding/json 包进行 Go时间类型转换 的核心方法。无论是使用标准格式、自定义字符串格式,还是 Unix 时间戳,都可以通过实现 MarshalJSON 和 UnmarshalJSON 接口灵活应对。这些技巧不仅能提升代码的可维护性,还能确保你的 API 与其他系统无缝对接。
赶快在你的项目中试试吧!如果你觉得这篇文章对你有帮助,欢迎分享给其他 Go 语言开发者。
本文由主机测评网于2025-12-09发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025125050.html