1. 程式人生 > 其它 >gorm查詢時間去掉時區問題

gorm查詢時間去掉時區問題

gorm查詢的時間格式是2022-03-03T14:32:05+08:00,這種格式不符合我們日常使用習慣,尤其是前端展示會額外佔用單元格寬度

gorm不提供時間格式的配置,只能自定義個一個型別,繼承time.Time,上程式碼,這個是網上一搜一堆的程式碼,沒啥可以說的

package utils

import (
	"database/sql/driver"
	"fmt"
	"time"
)

// 1. 建立 time.Time 型別的副本 XTime;
type MyTime struct {
	time.Time
}

// 2. 為 Xtime 重寫 MarshaJSON 方法,在此方法中實現自定義格式的轉換;
func (t MyTime) MarshalJSON() ([]byte, error) {
	output := fmt.Sprintf("\"%s\"", t.Format("2006-01-02 15:04:05"))
	return []byte(output), nil
}

// 3. 為 Xtime 實現 Value 方法,寫入資料庫時會呼叫該方法將自定義時間型別轉換並寫入資料庫;
func (t MyTime) Value() (driver.Value, error) {
	var zeroTime time.Time
	if t.Time.UnixNano() == zeroTime.UnixNano() {
		return nil, nil
	}
	return t.Time, nil
}

// 4. 為 Xtime 實現 Scan 方法,讀取資料庫時會呼叫該方法將時間資料轉換成自定義時間型別;
func (t *MyTime) Scan(v interface{}) error {
	value, ok := v.(time.Time)
	if ok {
		*t = MyTime{Time: value}
		return nil
	}
	return fmt.Errorf("can not convert %v to timestamp", v)
} 

下面就是我們怎麼在程式碼裡使用:

1、utils.MyTime{Time: time.Now()} 初始化當前的時間就是time.Now()

2、utils.MyTime{Time: scriptResult.Info.ExecTime} 將time.Time型別轉成utils.MyTime型別

3、utils.MyTime時間變數後面加.Time,可以轉換成time.Time型別(但是這個時間會帶有時區)