返回顶部
首页 > 资讯 > 后端开发 > GO >GO项目实战之Gorm格式化时间字段实现
  • 206
分享到

GO项目实战之Gorm格式化时间字段实现

golang格式化时间gorm格式化时间字段gorm使用 2023-01-07 15:01:28 206人浏览 泡泡鱼
摘要

目录Goshop开源项目的更新解决方法:补充:gORM时间格式化问题详解总结goshop开源项目的更新 备注:前面项目中用到的代码已经分享到GitHub中去了,并且以后所有项目中会出

goshop开源项目的更新

备注:前面项目中用到的代码已经分享到GitHub中去了,并且以后所有项目中会出现的代码都会提交上去,欢迎查阅。感兴趣的可以点个star哦~
https://gitee.com/jobhandsome/goshop/

在使用 gorm 查询时,如果未对时间字段进行处理,结构体内的字段类型咱们使用的是 time.Time

type Model struct {
    ID        int64      `JSON:"id" gorm:"primary_key"`
    CreatedAt *time.Time `json:"created_at"`
    UpdatedAt *time.Time `json:"updated_at"`
    DeletedAt *time.Time `json:"deleted_at" sql:"index"`
}

这里咱们使用 time.Time 类型在 gorm 进行查询的返回结果,读取到的时间字段往往是这样:“2022-07-03T22:14:02.973528+08:00”,带着时区和毫秒。但其实往往这样的格式,不是咱们想要的。

那么问题就来了:

  1. 如果想要 “2022-07-03 22:14:02” 这样的格式,需要怎么处理呢?
  2. 当插入一条数据到对应的表中时,UpdateAt 字段是不赋值的,插入到数据库则会 0001-01-01 00:00:00.000000+00:00,系统赋了⼀个默认值,当不想插⼊默认值时如何处理?

通过上面的分析,咱们能确定两个需求:

读取到的时间需要是:“2022-07-03 22:14:02” 这样的格式

当时间字段不赋值时,不插入默认值

解决方法:

定义一个时间类型 struct

type LocalTime time.Time

虽然该数据类型实际类型为 time.Time,但是不具备 time.Time 的内置⽅法,需要重写 MarshalJSON ⽅法来实现数据解析

func (t *LocalTime) MarshalJSON() ([]byte, error) {
    tTime := time.Time(*t)
    return []byte(fmt.Sprintf("\"%v\"", tTime.Format("2006-01-02 15:04:05"))), nil
}

注意:GO的格式化时间的规定时间字符串必须为 2006-01-02 15:04:05
这是GO的诞⽣时间,不能更改为其他时间(这个时间字符串与java的"yyyy-MM-dd HH:mm:ss")同作⽤

time.Time 替换成 LocalTime

type Model struct {
    ID        int64      `json:"id" gorm:"primary_key"`
    CreatedAt *LocalTime `json:"created_at"`
    UpdatedAt *localTime `json:"updated_at"`
    DeletedAt *localTime `json:"deleted_at" sql:"index"`
}

到了这一步就解决了第一个需求读取数据时将将时间数据格式化。

下面来实现第二个需求:

func (t LocalTime) Value() (driver.Value, error) {
    var zeroTime time.Time
    tlt := time.Time(t)
    //判断给定时间是否和默认零时间的时间戳相同
    if tlt.UnixNano() == zeroTime.UnixNano() {
        return nil, nil
    }
    return tlt, nil
}

Value⽅法即在存储时调⽤,将该⽅法的返回值进⾏存储,该⽅法可以实现数据存储前对数据进⾏相关操作。

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

Scan⽅法可以实现在数据查询出来之前对数据进⾏相关操作。

到了这一步,咱们就实现了上面需求的功能。

补充:gorm时间格式化问题详解

说明

在做项目时发现gorm的时间格式是带有时区输入输出的,对平常使用的2020-01-03 12:22:33格式有一定的出入,不方便前端后端的对接,所以自己整理一下处理这个问题方法,方便大家参考

代码如下

package models

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

//BaseModel 基础结构体 信息信息
type BaseModel struct {
	CreateTime MyTime `gorm:"comment:'创建时间';type:timestamp;";json:"createTime"`
	UpdateTime MyTime `gorm:"comment:'修改时间';type:timestamp;";json:"updateTime"`
	Remark     string `gorm:"comment:'备注'";json:"remark"`
}
//MyTime 自定义时间
type MyTime time.Time

func (t *MyTime) UnmarshalJSON(data []byte) error {
	if string(data) == "null" {
		return nil
	}
	var err error
	//前端接收的时间字符串
	str := string(data)
	//去除接收的str收尾多余的"
	timeStr := strings.Trim(str, "\"")
	t1, err := time.Parse("2006-01-02 15:04:05", timeStr)
	*t = MyTime(t1)
	return err
}

func (t MyTime) MarshalJSON() ([]byte, error) {
	formatted := fmt.Sprintf("\"%v\"", time.Time(t).Format("2006-01-02 15:04:05"))
	return []byte(formatted), nil
}

func (t MyTime) Value() (driver.Value, error) {
	// MyTime 转换成 time.Time 类型
	tTime := time.Time(t)
	return tTime.Format("2006-01-02 15:04:05"), nil
}

func (t *MyTime) Scan(v interface{}) error {
	switch vt := v.(type) {
	case time.Time:
		// 字符串转成 time.Time 类型
		*t = MyTime(vt)
	default:
		return errors.New("类型处理错误")
	}
	return nil
}

func (t *MyTime) String() string {
	return fmt.Sprintf("hhh:%s", time.Time(*t).String())
}

实现原理

其实现方式其实是通过在时间读取json时对解析格式进行重写,对转换成字符串时进行重写达到效果

总结

到此这篇关于GO项目实战之Gorm格式化时间字段实现的文章就介绍到这了,更多相关GO Gorm格式化时间字段内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: GO项目实战之Gorm格式化时间字段实现

本文链接: https://lsjlt.com/news/177065.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • GO项目实战之Gorm格式化时间字段实现
    目录goshop开源项目的更新解决方法:补充:gorm时间格式化问题详解总结goshop开源项目的更新 备注:前面项目中用到的代码已经分享到GitHub中去了,并且以后所有项目中会出...
    99+
    2023-01-07
    golang格式化时间 gorm格式化时间字段 gorm使用
  • Java验证时间格式是否正确方法类项目实战
    在很多场景中我们需要验证时间日期的是否属于正确的格式,验证时间是否符合常规的。 1、验证 yyyy-MM-dd HH:mm:dd 格式的日期 String date = "2020-...
    99+
    2024-04-02
  • js如何实现时间格式化
    小编给大家分享一下js如何实现时间格式化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!时间格式化界面展示的时间千变万化, 所以一个处理时间的函数,它的重要性就不言...
    99+
    2023-06-27
  • SpringBoot中如何实现时间格式化
    小编给大家分享一下SpringBoot中如何实现时间格式化,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!时间问题演示为了方便演示,我写了一个简单 Spring Boot 项目,其中数据库中包含了一张 userinfo 表,...
    99+
    2023-06-20
  • MySQL 格式化时间的实现示例
    目录mysql日期和时间类型DATE格式化TIME格式化DATETIME格式化TIMESTAMP格式化总结MySQL是一个非常流行的关系型数据库管理系统,它提供了一种使用SQL语言来管理和操作数据库的方法。在MySQL中...
    99+
    2023-10-12
    MySQL 格式化时间 MySQL DATE格式化 MySQL TIME格式化
  • python 时间戳与格式化时间的转化实现代码
    python 里面与时间有关的模块主要是 time 和 datetime 如果想获取系统当前时间戳:time.time() ,是一个float型的数据 获取系统当前的时间信息 : time.ctime() ...
    99+
    2022-06-04
    时间 代码 python
  • Java的API时间格式化怎么实现
    本篇内容主要讲解“Java的API时间格式化怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java的API时间格式化怎么实现”吧!新API的时间格式化新的时间API的时间格式化由java...
    99+
    2023-06-30
  • Java的API时间格式化如何实现
    这篇文章主要讲解了“Java的API时间格式化如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的API时间格式化如何实现”吧!新API的时间格式化新的时间API的时间格式化由j...
    99+
    2023-07-06
  • Pandas中字符串和时间转换与格式化的实现
    目录把字符串转为时间格式把时间格式化为字符串格式化某一列的时间为字符串遇到的错误使用apply()和lambda函数Pandas 提供了若干个函数来格式化时间。 把字符串转为时间格式...
    99+
    2023-01-17
    Pandas 字符串和时间转换 Pandas 字符串格式化 Pandas 时间格式化
  • c#时间转字符串格式怎么实现
    在C#中,可以使用DateTime类的ToString方法来将时间转换为特定的字符串格式。以下是一些常见的时间转换示例: 将时间转...
    99+
    2024-03-02
    c#
  • js中如何实现日期时间格式化
    这篇文章主要为大家展示了“js中如何实现日期时间格式化”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js中如何实现日期时间格式化”这篇文章吧。js日期时间格式化将日期时间转换为指定格式,如:YY...
    99+
    2023-06-20
  • Android开发中怎么实现格式化时间
    本篇文章给大家分享的是有关Android开发中怎么实现格式化时间,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。代码实现如下:import Java.text.SimpleDat...
    99+
    2023-05-31
    android roi
  • vue中如何实现格式化时间过滤器
    这篇文章主要为大家展示了“vue中如何实现格式化时间过滤器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中如何实现格式化时间过滤器”这篇文章吧。具体内容如...
    99+
    2024-04-02
  • python数据清洗中的时间格式化实现
    目录1.字符串转时间2.时间转字符串3.时间戳相互转换4.python中时间日期格式化符号:1.字符串转时间 from datetime import datetime t = '2...
    99+
    2024-04-02
  • c++11多种格式时间转化为字符串的方法实现
    1.打印系统当前时间,或者将系统当前时间转化为字符串 #include <iostream> #include <sstream> #include &l...
    99+
    2024-04-02
  • Pythontime时间格式化和设置时区实现代码详解
    目录1、时间戳转换为指定格式日期2、将字符串的时间转换为时间戳3、Datetime详细介绍4、获得三天前的时间的方法5、使用datetime模块来获取当前的日期和时间1、时间戳转换为...
    99+
    2023-02-24
    Python time时间格式化 Python time设置时区
  • Android日期时间格式国际化的实现代码
    在做多语言版本的时候,日期时间的格式话是一个很头疼的事情,幸好Android提供了DateFormate,可以根据指定的语言区域的默认格式来格式化。 直接贴代码: 代码如下:p...
    99+
    2022-06-06
    Android
  • SpringBoot实现设置全局和局部时间格式化
    目录前言解决问题1 全局设置(推荐)2 局部设置(不推荐)总结前言 在开发中,我们进行数据库查询日期类型的时候,往往不是我们想要的时间格式,比如下面的情况: 我数据库里面把这些日期相...
    99+
    2023-01-08
    SpringBoot 全局时间格式化 SpringBoot 局部时间格式化 SpringBoot时间格式化
  • C#如何实现日期时间的格式化输出
    这篇文章主要讲解了“C#如何实现日期时间的格式化输出”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何实现日期时间的格式化输出”吧!DateTime被放在System命名空间下,在顶级语...
    99+
    2023-07-05
  • golang中time包之时间间隔格式化和秒、毫秒、纳秒等时间戳格式输出的方法实例
    目录获取当前时间的年、月、日、时、分、秒的方法如下:获取从1970到现在经过的时间的方法如下:时间间隔格式化输出方法:总结获取当前时间的年、月、日、时、分、秒的方法如下: // 获...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作