樓上的回答說的很對,不知道題主問題解決了沒有。我也測試了一下,隨便把一些過程寫在這里。首先,要支持JSON的編解碼,就必須要實現(xiàn)兩個接口,分別是json.Marshaler(組包)和json.Unmashaler(解包)。兩個接口的定義如下:typeMarshalerinterface{MarshalJSON()([]byte,error)}typeUnmarshalerinterface{UnmarshalJSON([]byte)error}第一種方案,為什么必須是RFC3339格式。time.Time已經(jīng)實現(xiàn)了這兩個接口,可以進(jìn)入到time/time.go找到源碼實現(xiàn)。而之所以字段必須是RFC3999,因為time.Time實現(xiàn)的UnmarshalJSON方法就是按這個格式解析的。time.Time的UnmarshalJSON的源碼實現(xiàn)如下:func(t*Time)UnmarshalJSON(data[]byte)error{//Ignorenull,likeinthemainJSONpackage.ifstring(data)=="null"{returnnil}//FractionalsecondsarehandledimplicitlybyParse.varerrerror*t,err=Parse(`"`+RFC3339+`"`,string(data))returnerr}非常簡單。關(guān)于什么是RFC3999格式,題主可以參考這篇文章,互聯(lián)網(wǎng)上的日期和時間。假設(shè),現(xiàn)在需要一個支持自定義格式的時間類型,Go還是非常靈活的,基于time.Time重新定義即可,在這個基礎(chǔ)上再實現(xiàn)json.Unmarshaler接口。typeCTimetime.Time//UnmarshalJSONisjoson.Unmarshalerfunc(ct*CustomTime)UnmarshalJSON(data[]byte)error{//Ignorenull,likeinthemainJSONpackage.ifstring(data)=="null"{returnnil}//FractionalsecondsarehandledimplicitlybyParse.varerrerrort,_:=time.ParseInLocation(`"2006-01-02T15:04:05"`,string(data),time.Local)*ct=CustomTime(t)returnerr}和之前的time.Time實現(xiàn)基本一樣,只是解析的格式不一樣了。這里就可以不包含時區(qū)了,因為已經(jīng)固定時區(qū)為time.Local,即按當(dāng)前時區(qū)解析。如果想做的更靈活點(diǎn),可以用forrange把每個時間格式測試一下,通過判斷Parse返回的err確定是否解析成功。當(dāng)然,這種方法不推薦。這種方式的缺點(diǎn)是fmt.Printf打印的時候,時間不夠直觀,打印的底層的數(shù)據(jù),可以自己試下就知道。當(dāng)然,這應(yīng)該是可以解決的。還有另外一種方式,定義一個新的時間類型結(jié)構(gòu)體,里面只有一個time.Time類型成員。typeCustomTimestruct{Timetime.Time}func(ct*CustomTime)UnmarshalJSON(data[]byte)error{//Ignorenull,likeinthemainJSONpackage.ifstring(data)=="null"{returnnil}//FractionalsecondsarehandledimplicitlybyParse.varerrerrorct.Time,err=time.ParseInLocation(`"2006-01-02T15:04:05"`,string(data),time.Local)returnerr}代碼都差不多。這種方式再使用fmt.Printf打印,效果就好了很多。