最近在開發項目時遇到了發現一個問題,


gorm雖然可以自動幫你維護 created_at、updated_at、deleted_at這些關鍵時間字段。但是其原理與弊端需要了解一" />

golang gorm中格式化時間問題詳解

 更新時間:2019-09-09 09:01:35   作者:佚名   我要評論(0)

前言
最近在開發項目時遇到了發現一個問題,


gorm雖然可以自動幫你維護 created_at、updated_at、deleted_at這些關鍵時間字段。但是其原理與弊端需要了解一

前言

最近在開發項目時遇到了發現一個問題,

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.實現原理

其實現方式其實是通過在save變更時,通過callback功能,將其定義為當前時間。文章可參考 傳送門

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

3.弊端與建議

因為在程序運行時,createAt這類字段的類型還是 LocalTime,所以如果你想自己給其復制,是不太容易做到的。

例如,你想在程序運行時改一下其createAt的時間。你做不到! 因為它的類型是LocalTime,而你的時間要么是時間戳,要么是一個字符串,類型不匹配。。。是不是很尷尬???

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

當然也可以將這工作自己封裝成一個callback函數,這樣你就能夠隨意控制這個字段了。可參考上文傳送門中的內容。

所以,想吐槽的是,gorm對時間格式化的這種實現方式,太不人性化了!

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:

  • golang gorm 操作mysql及gorm基本用法
  • Go語言中使用gorm小結

相關文章

  • golang gorm中格式化時間問題詳解

    golang gorm中格式化時間問題詳解

    前言 最近在開發項目時遇到了發現一個問題, gorm雖然可以自動幫你維護 created_at、updated_at、deleted_at這些關鍵時間字段。但是其原理與弊端需要了解一
    2019-09-09
  • Golang TCP粘包拆包問題的解決方法

    Golang TCP粘包拆包問題的解決方法

    什么是粘包問題 最近在使用Golang編寫Socket層,發現有時候接收端會一次讀到多個數據包的問題。于是通過查閱資料,發現這個就是傳說中的TCP粘包問題。下面
    2019-09-09
  • 下載golang.org/x包的操作方法

    下載golang.org/x包的操作方法

    golang.org/x包放到了https://github.com/golang/text中,下載時需要先在本地建立golang.org/x的目錄后,再下載。 mkdir -p golang.org/x git clone https://
    2019-09-09
  • Golang 使用http Client下載文件的實現方法

    Golang 使用http Client下載文件的實現方法

    之前使用beego的http庫的時候,有的情況需要下載文件。beego是能實現,但就是有點問題:不支持回調,沒法顯示下載速度,這在日常開發中是不可忍受的。 看了下be
    2019-09-09
  • 基于Go和Gin的環境配置方法

    基于Go和Gin的環境配置方法

    1.官方下載Go版本,安裝相應平臺的程序。 2.配置Go的環境變量: GOROOT:GO安裝路徑,例如GOROOT = D:\Go GOPATH: 項目源碼所在目錄(例如GOPATH = E:\go),
    2019-09-09
  • golang 檢查網絡狀態是否正常的方法

    golang 檢查網絡狀態是否正常的方法

    如下所示: package main import ( "fmt" "os/exec" "time" ) func NetWorkStatus() bool { cmd := exec.Command("ping", "baidu.com", "-c", "1", "
    2019-09-09
  • gorm golang 并發連接數據庫報錯的解決方法

    gorm golang 并發連接數據庫報錯的解決方法

    底層報錯 error:cannot assign requested address 原因 并發場景下 client 頻繁請求端口建立tcp連接導致端口被耗盡 解決方案 root執行即可 sysctl -w net.
    2019-09-09
  • golang socket斷點續傳大文件的實現方法

    golang socket斷點續傳大文件的實現方法

    在日常編程中,我們肯定會遇到用socket傳送文件內容,如果是大文件的,總不能傳送到一半因某原因斷掉了,又從新傳送文件內容吧。對,我們需要續傳,也就是接著
    2019-09-09
  • golang http連接復用方法

    golang http連接復用方法

    server端 golang httpserver 默認開啟keepalive連接復用選項 handler函數需要完整讀body數據,構造返回消息,否則當數據不能一次發送完成時,連接復用就會失效
    2019-09-09
  • 詳解golang 模板(template)的常用基本語法

    詳解golang 模板(template)的常用基本語法

    模板 在寫動態頁面的網站的時候,我們常常將不變的部分提出成為模板,可變部分通過后端程序的渲染來生成動態網頁,golang提供了html/template包來支持模板
    2019-09-09

最新評論

黑龙江新11选5开奖结果