首页 > 其他分享 >Golang Gorm time 时间字段格式化模型类 重写

Golang Gorm time 时间字段格式化模型类 重写

时间:2022-10-13 16:57:19浏览次数:48  
标签:00 return nil time Golang func Time Gorm

问题:

在使用GORM中 如果我们使用到了CreateAt 和UpdateAt 就会发现 这个时间的类型是time.Time 而其数据是"2022-10-13T10:14:02.973528+08:00" 这样的,
然而这样的数据你说能用确实能用 ,但是一旦写入数据库中就变成了
0001-01-01 00:00:00.000000 +00:00

重写数据类型

话不多说 直接上代码
并且此代码通用【小弟也是copy学习视频上的】

package model

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

const timeFormat = "2006-01-02 15:04:05"
const timezone = "Asia/Shanghai"

type Time time.Time

func (t Time) MarshalJSON() ([]byte, error) {
    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) UnmarshalJSON(data []byte) (err error) {
    now, err := time.ParseInLocation(`"`+timeFormat+`"`, string(data), time.Local)
    *t = Time(now)
    return
}

func (t Time) String() string {
    return time.Time(t).Format(timeFormat)
}

func (t Time) local() time.Time {
    loc, _ := time.LoadLocation(timezone)
    return time.Time(t).In(loc)
}

func (t Time) Value() (driver.Value, error) {
    var zeroTime time.Time
    var ti = time.Time(t)
    if ti.UnixNano() == zeroTime.UnixNano() {
        return nil, nil
    }
    return ti, nil
}

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

调用

至于调用就更简单了 如下代码所示


package model

type Category struct {
	//*gorm.Model
	ID       uint      `json:"id" gorm:"primary key"`
	Name     string    `json:"name" gorm:"type:varchar(50); not null;unique"`
	CreatedAt Time`json:"create_at"`
	UpdatedAt Time`json:"update_at"`
}

标签:00,return,nil,time,Golang,func,Time,Gorm
From: https://www.cnblogs.com/zichliang/p/16788724.html

相关文章

  • Golang复杂json结构体解析
    1、示例一{"id":"8667597b-bcd9-51de31b655cd","name":"ali-redis-analyse","category":"db","category_display":"数据库","type":"redis","type_display":......
  • golang usps api对接
    golanguspsapi对接简介实现对接uspsapi接口使用gogetgithub.com/wms3001/USPS实例获取跟踪信息usps:=&USPS{}usps.UserId="680CHUAN3141"resp:=usps.Track("930......
  • 实例分析Scheduled Thread Pool Executor与Timer的区别
    摘要:JDK1.5开始提供ScheduledThreadPoolExecutor类,ScheduledThreadPoolExecutor类继承ThreadPoolExecutor类重用线程池实现了任务的周期性调度功能。本文分享自华......
  • 线程池 keepAlivetime 参数详解
    线程池七大参数 核心线程数,最大线程数,任务队列,超时时间,时间单位,线程工厂,拒绝策略线程池执行流程:添加一个任务到线程池 -> 判断当前线程数量是否大于核心线程数 ......
  • mysql中timestamp和datetime类型的区别
    一、MySQL中表示当前时间的方法:CURRENT_TIMESTAMPCURRENT_TIMESTAMP()NOW()LOCALTIMELOCALTIME()LOCALTIMESTAMPLOCALTIMESTAMP()二、关于TIMESTAMP和DATETIME的比较一个完......
  • Electron RequestError: connect ETIMEDOUT 20.205.243.166:443
    问题描述下载electron时,卡在了下载超时,换github.comip无效、用梯子无效,直到官网这里找到了原因:MirrorYoucanuseenvironmentvariablestooverridethebaseURL,......
  • mysql 插入Timestamp 少8个小时
    转:mysql插入timeStamp类型数据时间相差8小时的解决办法 mysql插入时间少八个小时 MySQL插入时间差八小时问题的解决方法如果时间和你本地当前时间一致说明mysql的时......
  • 【高并发】ScheduledThreadPoolExecutor与Timer的区别和简单示例
    JDK1.5开始提供ScheduledThreadPoolExecutor类,ScheduledThreadPoolExecutor类继承ThreadPoolExecutor类重用线程池实现了任务的周期性调度功能。在JDK1.5之前,实现任务的......
  • Unity热更技术对比(Lua、ILRuntime、HybridCLR)
    热更技术原理:app+脚本解释器+脚本代码,动态执行最新代码,实现热更。解释器:Lua技术=Lua解释器+Lua脚本;C#=C#解释器+c#脚本Unity的热更方案:Lua解决方案(如ToLua,xLu......
  • java中Runtime类执行研究
    Runtime类在java中一般类的调用方法是new类();所以我们使用newRuntime()来实例化一个Runtime类的对象importjava.io.IOException;publicclassmain{public......