golang gorm中格式化時(shí)間問(wèn)題詳解
前言
最近在開(kāi)發(fā)項(xiàng)目時(shí)遇到了發(fā)現(xiàn)一個(gè)問(wèn)題,
gorm雖然可以自動(dòng)幫你維護(hù) created_at、updated_at、deleted_at這些關(guān)鍵時(shí)間字段。但是其原理與弊端需要了解一下。
1.使用方法
通過(guò)自定義一個(gè)localtime的結(jié)構(gòu),來(lái)控制時(shí)間的格式
package utils import ( "time" //"strconv" "fmt" "database/sql/driver" "strconv" ) type LocalTime struct { time.Time } func (t LocalTime) MarshalJSON() ([]byte, error) { //格式化秒 seconds := t.Unix() return []byte(strconv.FormatInt(seconds, 10)), nil } func (t LocalTime) Value() (driver.Value, error) { var zeroTime time.Time if t.Time.UnixNano() == zeroTime.UnixNano() { return nil, nil } return t.Time, nil } func (t *LocalTime) Scan(v interface{}) error { value, ok := v.(time.Time) if ok { *t = LocalTime{Time: value} return nil } return fmt.Errorf("can not convert %v to timestamp", v) }
此時(shí)dao的字段結(jié)構(gòu)為
type TestDao struct{ Id uint `gorm:"primary_key,AUTO_INCREMENT" json:"id"` CreatedAt LocalTime `json:"-"` UpdatedAt LocalTime `json:"update_at"` DeletedAt *LocalTime `json:"-"` }
2.實(shí)現(xiàn)原理
其實(shí)現(xiàn)方式其實(shí)是通過(guò)在save變更時(shí),通過(guò)callback功能,將其定義為當(dāng)前時(shí)間。文章可參考 傳送門(mén)
這樣你就可以通過(guò)自定義的LocalTime來(lái)控制時(shí)間格式。
3.弊端與建議
因?yàn)樵诔绦蜻\(yùn)行時(shí),createAt這類(lèi)字段的類(lèi)型還是 LocalTime,所以如果你想自己給其復(fù)制,是不太容易做到的。
例如,你想在程序運(yùn)行時(shí)改一下其createAt的時(shí)間。你做不到! 因?yàn)樗念?lèi)型是LocalTime,而你的時(shí)間要么是時(shí)間戳,要么是一個(gè)字符串,類(lèi)型不匹配。。。是不是很尷尬???
所以建議這類(lèi)保留字段還是不要在程序運(yùn)行時(shí)去修改。只用它作為記錄或標(biāo)識(shí)即可。如果真的需要更改時(shí)間,還是自己維護(hù)字段的內(nèi)容吧。例如用int存時(shí)間戳或string存字符串。然后每次變更時(shí),去修改它的值。
當(dāng)然也可以將這工作自己封裝成一個(gè)callback函數(shù),這樣你就能夠隨意控制這個(gè)字段了。可參考上文傳送門(mén)中的內(nèi)容。
所以,想吐槽的是,gorm對(duì)時(shí)間格式化的這種實(shí)現(xiàn)方式,太不人性化了!
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
- 如何使用Go語(yǔ)言獲取當(dāng)天、昨天、明天、某天0點(diǎn)時(shí)間戳以及格式化時(shí)間
- GO項(xiàng)目實(shí)戰(zhàn)之Gorm格式化時(shí)間字段實(shí)現(xiàn)
- go語(yǔ)言中時(shí)間戳格式化的方法
- golang 使用time包獲取時(shí)間戳與日期格式化操作
- golang中time包之時(shí)間間隔格式化和秒、毫秒、納秒等時(shí)間戳格式輸出的方法實(shí)例
- 詳解Go如何優(yōu)雅的對(duì)時(shí)間進(jìn)行格式化
- django rest framework serializer返回時(shí)間自動(dòng)格式化方法
- go語(yǔ)言中g(shù)orm時(shí)間格式化
- golang中的時(shí)間格式化
- 提升編程技能:學(xué)習(xí)如何在Go語(yǔ)言中正確格式化時(shí)間
相關(guān)文章
Golang實(shí)現(xiàn)Json分級(jí)解析及數(shù)字解析實(shí)踐詳解
你是否遇到過(guò)在無(wú)法準(zhǔn)確確定json層級(jí)關(guān)系的情況下對(duì)json進(jìn)行解析的需求呢?本文就來(lái)和大家介紹一次解析不確定的json對(duì)象的經(jīng)歷,以及遇到的問(wèn)題和解決方法2023-02-02GoLang channel底層代碼實(shí)現(xiàn)詳解
Channel和goroutine的結(jié)合是Go并發(fā)編程的大殺器。而Channel的實(shí)際應(yīng)用也經(jīng)常讓人眼前一亮,通過(guò)與select,cancel,timer等結(jié)合,它能實(shí)現(xiàn)各種各樣的功能。接下來(lái),我們就要梳理一下GoLang channel底層代碼實(shí)現(xiàn)2022-10-10

GoLang基于zap日志庫(kù)的封裝過(guò)程詳解

10個(gè)現(xiàn)代網(wǎng)站開(kāi)發(fā)必備的Go軟件包工具盤(pán)點(diǎn)

Go語(yǔ)言實(shí)現(xiàn)的簡(jiǎn)單網(wǎng)絡(luò)端口掃描方法