gorm自定义时间类型存取

由于 Go 自身的 time.Time 时间类型默认解析的格式与前端所传的格式(yy-mm-dd HH:ii:ss)不同,使用gin框架和gorm框架进行解析会存在问题,需要自定义时间类型

package main

import (
	"database/sql/driver"
	"errors"
	"fmt"
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"time"
)

var GDB *gorm.DB

const TimeFormat = "2006-01-02 15:04:05"

type Time time.Time

func (t *Time) UnmarshalJSON(data []byte) (err error) {
	if len(data) > 2 && data[0] == '"' {
		now, err := time.ParseInLocation(`"`+TimeFormat+`"`, string(data), time.Local)
		*t = Time(now)
		return err
	}
	return
}

func (t Time) MarshalJSON() ([]byte, error) {
        if time.Time(t).IsZero() {
		return []byte("\"\""), nil
	}
	b := make([]byte, 0, len(TimeFormat)+2)
	b = append(b, '"')
	b = time.Time(t).AppendFormat(b, TimeFormat)
	b = append(b, '"')
	return b, nil
}

func (t Time) String() string {
	return time.Time(t).Format(TimeFormat)
}
// Value insert timestamp into mysql need this function.
func (t Time) Value() (driver.Value, error) {
        if time.Time(t).IsZero() {
		return nil, nil
	}
	return time.Time(t), nil
}

// Scan value of time.Time
func (t *Time) Scan(value interface{}) error {
	timeValue, ok := value.(time.Time)
	if !ok {
		return errors.New(fmt.Sprint("Failed to unmarshal time value:", value))
	}
	*t = Time(timeValue)
	return nil
}

func main() {
	GDB = getDB()
	// 创建一个默认的路由引擎
	r := gin.Default()
	// GET:请求方式;/hello:请求的路径
	// 当客户端以GET方法请求/hello路径时,会执行后面的匿名函数
	r.POST("/dev", func(c *gin.Context) {
		type User struct {
			CreateTime Time `json:"create_time"`
		}
		var user User
		if err := c.ShouldBindJSON(&user);err != nil{
			fmt.Println(err)
		} else {
			GDB.Create(&user)
			var fUser User
			GDB.Model(&user).Find(&fUser)
			c.JSON(200, gin.H{
				"user": fUser,
			})
		}
	})
	// 启动HTTP服务,默认在0.0.0.0:8080启动服务
	r.Run()
}

posted @   burndust  阅读(447)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示