gorm的时间处理


gorm的时间处理

由于gorm没有提供友好的时间处理功能,例如:查询的时间格式“2019-08-12T14:38:47”,这样的时间格式是及其不友好的,我们可以采用自定义数据类型的方式进行处理

1.自定义数据类型

package main
package utils

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

// JSONTime format json time field by myself
type JSONTime struct {
    time.Time
}

// MarshalJSON on JSONTime format Time field with %Y-%m-%d %H:%M:%S
func (t JSONTime) MarshalJSON() ([]byte, error) {
    if (t == JSONTime{}) {
        formatted := fmt.Sprintf("\"%s\"", "")
        return []byte(formatted), nil
    } else {
        formatted := fmt.Sprintf("\"%s\"", t.Format("2006-01-02 15:04:05"))
        return []byte(formatted), nil
    }
}

// Value insert timestamp into mysql need this function.
func (t JSONTime) Value() (driver.Value, error) {
    var zeroTime time.Time
    if t.Time.UnixNano() == zeroTime.UnixNano() {
        return nil, nil
    }
    return t.Time, nil
}

// Scan valueof time.Time
func (t *JSONTime) Scan(v interface{}) error {
    value, ok := v.(time.Time)
    if ok {
        *t = JSONTime{Time: value}
        return nil
    }
    return fmt.Errorf("can not convert %v to timestamp", v)
}

定义一个基础struct,让所有的model都继承

type Model struct {
    ID        uint           `gorm:"primary_key" json:"id"`
    CreatedAt utils.JSONTime `json:"createdAt"`
    UpdatedAt utils.JSONTime `json:"updatedAt"`
    DeletedAt utils.JSONTime `json:"deletedAt"`

2.使用时转换

type Model struct {
	TimeBegin    *time.Time  `json:"time_begin"`
	TimeEnd      *time.Time  `json:"time_end"`
}

转换方法

func StrToTime(str string) *time.Time {
	t, _ := time.ParseInLocation("2006-01-02 15:04:05", str, time.Local)
	return &t
}

func TimeToStr(t *time.Time) string {
	return t.Format("2006-01-02 15:04:05")
}

文章作者: wmg
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 wmg !
  目录