主頁 > 知識(shí)庫(kù) > golang gorm中格式化時(shí)間問題詳解

golang gorm中格式化時(shí)間問題詳解

熱門標(biāo)簽:地圖標(biāo)注的汽車標(biāo) 江西轉(zhuǎn)化率高的羿智云外呼系統(tǒng) 學(xué)海導(dǎo)航地圖標(biāo)注 西部云谷一期地圖標(biāo)注 浙江高速公路地圖標(biāo)注 廣州呼叫中心外呼系統(tǒng) 高德地圖標(biāo)注口訣 南通如皋申請(qǐng)開通400電話 中國(guó)地圖標(biāo)注省會(huì)高清

前言

最近在開發(fā)項(xiàng)目時(shí)遇到了發(fā)現(xiàn)一個(gè)問題,

gorm雖然可以自動(dòng)幫你維護(hù) created_at、updated_at、deleted_at這些關(guān)鍵時(shí)間字段。但是其原理與弊端需要了解一下。

1.使用方法

通過自定義一個(gè)localtime的結(jié)構(gòu),來控制時(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í)是通過在save變更時(shí),通過callback功能,將其定義為當(dāng)前時(shí)間。文章可參考 傳送門

這樣你就可以通過自定義的LocalTime來控制時(shí)間格式。

3.弊端與建議

因?yàn)樵诔绦蜻\(yùn)行時(shí),createAt這類字段的類型還是 LocalTime,所以如果你想自己給其復(fù)制,是不太容易做到的。

例如,你想在程序運(yùn)行時(shí)改一下其createAt的時(shí)間。你做不到! 因?yàn)樗念愋褪荓ocalTime,而你的時(shí)間要么是時(shí)間戳,要么是一個(gè)字符串,類型不匹配。。。是不是很尷尬???

所以建議這類保留字段還是不要在程序運(yùn)行時(shí)去修改。只用它作為記錄或標(biāo)識(shí)即可。如果真的需要更改時(shí)間,還是自己維護(hù)字段的內(nèi)容吧。例如用int存時(shí)間戳或string存字符串。然后每次變更時(shí),去修改它的值。

當(dāng)然也可以將這工作自己封裝成一個(gè)callback函數(shù),這樣你就能夠隨意控制這個(gè)字段了??蓞⒖忌衔膫魉烷T中的內(nèi)容。

所以,想吐槽的是,gorm對(duì)時(shí)間格式化的這種實(shí)現(xiàn)方式,太不人性化了!

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:
  • golang 使用time包獲取時(shí)間戳與日期格式化操作
  • django rest framework serializer返回時(shí)間自動(dòng)格式化方法
  • go語言中時(shí)間戳格式化的方法
  • Go中time.RFC3339 時(shí)間格式化的實(shí)現(xiàn)

標(biāo)簽:貴州 東營(yíng) 許昌 德宏 吐魯番 常州 保定 曲靖

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang gorm中格式化時(shí)間問題詳解》,本文關(guān)鍵詞  golang,gorm,中,格式化,時(shí)間,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang gorm中格式化時(shí)間問題詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang gorm中格式化時(shí)間問題詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章