golang日期类型自动格式化
go的time.Time默认的序列化格式一般很难用到业务中来,每次都要调用Format方法来转换挺麻烦的,项目中可以将time.Time包装一下,实现自定义的UnmarshalJSON和MarshalJSON方法,这样就可以达到自动格式化的目的。
实现
自定义Time类型
package modelimport "time"const ( DateFormat = "2006-01-02" TimeFormat = "15:04:05" DateTimeFormat = "2006-01-02 15:04:05")type Time struct { time.Time pattern string}func Now() Time { return Time{ Time: time.Now(), pattern: DateTimeFormat, }}func (t *Time) SetPattern(pattern string) { t.pattern = pattern}func (t *Time) UnmarshalJSON(data []byte) (err error) { now, err := time.ParseInLocation(`"`+t.pattern+`"`, string(data), time.Local) *t = Time{ Time: now, pattern: t.pattern, } return}func (t Time) MarshalJSON() ([]byte, error) { b := make([]byte, 0, len(t.pattern)+2) b = append(b, '"') b = t.Time.AppendFormat(b, t.pattern) b = append(b, '"') return b, nil}func (t Time) String() string { return t.Time.Format(t.pattern)}测试
package modelimport ( "testing" "time")func TestTime(t *testing.T) { uft := time.Now() t.Logf("uft: %v", uft) ft := Now() t.Logf("ft: %v", ft) ft.SetPattern(DateFormat) t.Logf("ft: %v", ft) ft.SetPattern(TimeFormat) t.Logf("ft: %v", ft)}输出
=== RUN TestTime time_test.go:10: uft: 2024-01-15 18:25:43.497689 +0800 CST m=+0.000794334 time_test.go:12: ft: 2024-01-15 18:25:43 time_test.go:14: ft: 2024-01-15 time_test.go:16: ft: 18:25:43--- PASS: TestTime (0.00s)PASS