第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請各位大佬指點(diǎn)!golang time Unmarshal 必須包含時區(qū)嗎?求老司機(jī)指點(diǎn)!

請各位大佬指點(diǎn)!golang time Unmarshal 必須包含時區(qū)嗎?求老司機(jī)指點(diǎn)!

犯罪嫌疑人X 2019-11-03 15:54:48
不包含時區(qū)貌似不會成功呢
查看完整描述

2 回答

?
偶然的你

TA貢獻(xiàn)1841條經(jīng)驗 獲得超3個贊

樓上的回答說的很對,不知道題主問題解決了沒有。我也測試了一下,隨便把一些過程寫在這里。
首先,要支持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.Unmarshaler
func(ct*CustomTime)UnmarshalJSON(data[]byte)error{
//Ignorenull,likeinthemainJSONpackage.
ifstring(data)=="null"{
returnnil
}
//FractionalsecondsarehandledimplicitlybyParse.
varerrerror
t,_:=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.
varerrerror
ct.Time,err=time.ParseInLocation(`"2006-01-02T15:04:05"`,string(data),time.Local)
returnerr
}
代碼都差不多。這種方式再使用fmt.Printf打印,效果就好了很多。
                            
查看完整回答
反對 回復(fù) 2019-11-03
  • 2 回答
  • 0 關(guān)注
  • 335 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號