golang gorm中格式化時間問題詳解
前言
最近在開發(fā)項目時遇到了發(fā)現(xiàn)一個問題,
gorm雖然可以自動幫你維護 created_at、updated_at、deleted_at這些關鍵時間字段。但是其原理與弊端需要了解一下。
1.使用方法
通過自定義一個localtime的結構,來控制時間的格式
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) }
此時dao的字段結構為
type TestDao struct{ Id uint `gorm:"primary_key,AUTO_INCREMENT" json:"id"` CreatedAt LocalTime `json:"-"` UpdatedAt LocalTime `json:"update_at"` DeletedAt *LocalTime `json:"-"` }
2.實現(xiàn)原理
其實現(xiàn)方式其實是通過在save變更時,通過callback功能,將其定義為當前時間。文章可參考 傳送門
這樣你就可以通過自定義的LocalTime來控制時間格式。
3.弊端與建議
因為在程序運行時,createAt這類字段的類型還是 LocalTime,所以如果你想自己給其復制,是不太容易做到的。
例如,你想在程序運行時改一下其createAt的時間。你做不到! 因為它的類型是LocalTime,而你的時間要么是時間戳,要么是一個字符串,類型不匹配。。。是不是很尷尬???
所以建議這類保留字段還是不要在程序運行時去修改。只用它作為記錄或標識即可。如果真的需要更改時間,還是自己維護字段的內(nèi)容吧。例如用int存時間戳或string存字符串。然后每次變更時,去修改它的值。
當然也可以將這工作自己封裝成一個callback函數(shù),這樣你就能夠隨意控制這個字段了。可參考上文傳送門中的內(nèi)容。
所以,想吐槽的是,gorm對時間格式化的這種實現(xiàn)方式,太不人性化了!
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關文章
Golang實現(xiàn)Json分級解析及數(shù)字解析實踐詳解
你是否遇到過在無法準確確定json層級關系的情況下對json進行解析的需求呢?本文就來和大家介紹一次解析不確定的json對象的經(jīng)歷,以及遇到的問題和解決方法2023-02-0210個現(xiàn)代網(wǎng)站開發(fā)必備的Go軟件包工具盤點
這篇文章主要為大家介紹了10個現(xiàn)代網(wǎng)站開發(fā)必備的Go軟件包,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10