当前位置: 代码网 > it编程>前端脚本>Golang > Golang实现自定义时间结构体并支持Json&Gorm

Golang实现自定义时间结构体并支持Json&Gorm

2024年05月18日 Golang 我要评论
前言因为时区等问题,很多项目需要自定义时区和时间格式。还有需要自定义输出显示。方案代码package timetoolimport ("database/sql/driver""fmt""time")

前言

因为时区等问题,很多项目需要自定义时区和时间格式。还有需要自定义输出显示。

方案

代码

package timetool

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

const timeformat = "2006-01-02 15:04:05"
const formatisotime = "2006-01-02t15:04:05z"
const dayformat = "20060102"
const seconddateformat = "20060102150405"
const fyear = "2006"     //年
const fmonth = "01"      //月
const fmonthnozero = "1" //月,不带先导零
const fday = "02"        //日
const fdaynozero = "2"   //日,不带先导零
const fhour = "15"       // 小时,24小时格式
const fminute = "04"     // 分钟
const fsecond = "05"     // 秒

// 1. 创建 time.time 类型的副本 xtime;
type mytime struct {
	time.time
}

// 2. 为 mytime 重写 marshajson 方法,在此方法中实现自定义格式的转换;
func (t mytime) marshaljson() ([]byte, error) {

	loc := time.fixedzone(pkg.timelocal.timezone, pkg.timelocal.timeoffset)
	output := fmt.sprintf("\"%s\"", t.in(loc).format(timeformat))
	return []byte(output), nil
}

// 3. 为 mytime 实现 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. 为 mytime 实现 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)
}

func (t *mytime) string() string {
	loc := time.fixedzone(pkg.timelocal.timezone, pkg.timelocal.timeoffset)
	return t.in(loc).string()
}

func (t *mytime) gettime() time.time {
	loc := time.fixedzone(pkg.timelocal.timezone, pkg.timelocal.timeoffset)
	return t.in(loc)
}

func (t *mytime) unmarshaljson(data []byte) (err error) {
	// 空值不进行解析
	if len(data) == 2 {
		return
	}

	if string(data) == "null" {
		return
	}

	var now time.time
	// 指定解析的格式
	if now, err = time.parseinlocation(timeformat, string(data), time.local); err == nil {
		*t = mytime{now}
		return
	}
	// 指定解析的格式
	if now, err = time.parseinlocation('"'+timeformat+'"', string(data), time.local); err == nil {
		*t = mytime{now}
		return
	}
	//解析默认格式
	if now, err = time.parseinlocation('"'+time.rfc3339+'"', string(data), time.local); err == nil {
		*t = mytime{now}
		return
	}

	return
}

func mytimenow() mytime {
	return mytime{time: time.now()}
}

func newmytime(ts ...int64) *mytime {
	if len(ts) == 0 {
		return &mytime{time: time.now()}
	}
	loc := time.fixedzone(pkg.timelocal.timezone, pkg.timelocal.timeoffset)
	return &mytime{
		time: time.unix(ts[0], 0).in(loc),
	}
}

注意:

json 关键点:

  • 实现 marshaljson 方法
  • 实现 unmarshaljson 方法
  • 实现 value 方法

gorm关键点:

  • 实现 scan 方法
  • 实现 string 方法

到此这篇关于golang实现自定义时间结构体并支持json&gorm的文章就介绍到这了,更多相关go自定义时间结构体内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com