GO项目实战 — Gorm格式化时间字段_gorm time-程序员宅基地

技术标签: golang  GO  后端  开发语言  

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,系统赋了⼀个默认值,当不想插⼊默认值时如何处理?

通过上面的分析,咱们能确定两个需求:
  1. 读取到的时间需要是:“2022-07-03 22:14:02” 这样的格式

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

解决方法:
定义一个时间类型 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⽅法可以实现在数据查询出来之前对数据进⾏相关操作。

到了这一步,咱们就实现了上面需求的功能。 更多功能请持续关注!!!!!

星球地址:https://t.zsxq.com/03MJM7YfI
关注公众号「程序员小乔」

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LW1314QS/article/details/125605988

智能推荐

017、Python+fastapi,第一个Python项目走向第17步:ubuntu24.04 无界面服务器版下安装nvidia显卡驱动

新的ubuntu24.04正式版发布了,前段时间玩了下桌面版,感觉还行,先安装一个服务器无界面版本吧安装时有一个openssh选择安装,要不然就不能ssh远程,我就是没选,后来重新安装ssh。另外一个就是安装过程中静态ip设置下在etc/netplan 文件夹下,有一个yaml文件,我的是50-cloud-init.yaml,先用ip a看看network:ethernets:enp3s0:routes:version: 2。

不是阿里P8级大佬,岂能错过这篇MySQL运维内参?啃透涨薪so easy-程序员宅基地

文章浏览阅读176次。写在前面MySQL被设计为一个可移植的数据库,几乎在当前所有系统上都能运行,如Linux、Solaris、 FreeBSD、 Mac和Windows。尽管各平台在底层(如线程)实现方面都各有不同,但是MySQL基本上能保证在各平台上的物理体系结构的一致性。因此,用户应该能很好地理解MySQL数据库在所有这些平台上是如何运作的。由于工作的缘故,笔者的大部分时间需要与开发人员进行数据库方面的沟通,并对他们进行培训。不论他们是DBA,还是开发人员,似乎都对MySQL的体系结构了解得不够透彻。很多人喜欢把M_mysql运维内参

百度正用谷歌AlphaGo,解决一个比围棋更难的问题 | 300块GPU在燃烧-程序员宅基地

文章浏览阅读382次。晓查 发自 凹非寺量子位 报道 | 公众号 QbitAI9102年,人类依然不断回想起围棋技艺被AlphaGo所碾压的恐怖。却也有不以为然的声音:只会下棋的AI,再厉害..._alpha go训练用了多少个gpu

docker 容器 设置网络代理_docker export http_proxy-程序员宅基地

文章浏览阅读3.3k次。docker 容器 设置网络代理以/bin/bash 形式进入容器:【设置http 及https代理】,如下:export http_proxy=http://172.16.0.20:3128export https_proxy=https://172.16.0.20:3128要取消该设置:unsethttp_proxyunset https_proxy..._docker export http_proxy

linux之笔记_linux 0775十六進制-程序员宅基地

文章浏览阅读263次。授课环境: 结束程序运行: ctrl + c 共享目录(工作目录): /kyo /Videos 访问共享目录流程: 是否能连通服务器 ping 3.3.3.9 是否服务器开启共享 showmount -e 3.3.3.9 挂载共享目录到本地: _linux 0775十六進制

普通屏幕已过时?裸眼3D屏幕显示效果更胜一筹!

与普通屏幕中播放的视频相对,裸眼3D屏幕需要先将裸眼3D视频分成两部分,分别呈现在左右两个视窗上,因此后者需要更高的分辨率,以及更精细的图像处理能力,以此使裸眼3D屏幕的画面展示效果更加细腻,进而加深每个物体和场景的深度感和空间感,让每个驻足于此的观众惊叹于裸眼3D屏幕的震撼视觉效果。另外,裸眼3D屏幕的色彩表现,也比大多的普通屏幕更加丰富和鲜艳,能够展现出电影级别的画面质量,总而言之,裸眼3D屏幕比之普通屏幕的显示效果,有着巨大的优势,这也是使裸眼3D成为重要显示技术的重要原因!

随便推点

K210与STM32之间的通信_k210与stm32通信-程序员宅基地

文章浏览阅读5.1k次,点赞2次,收藏70次。K210与STM32之间使用串口进行通信_k210与stm32通信

OpenHarmony语言基础类库【@ohos.util.List (线性容器List)】

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点。

[自学笔记] ESP32-C3 Micropython初次配置

2、本次测试了两款IDE,分别是"thonny-4.1.4.exe"和"uPyCraft-v1.0.exe"。Thonny支持中文及多语言。而uPyCraft-v1.0只支持英文语言。因此入门时选用了Thonny作为IDE。(注:1、测试过程中IDE正常连接ESP32C3简约版的虚拟串口。不受简约版无串口芯片的影响。

初识Electron,创建桌面应用

古有匈奴犯汉,晋室不纲,铁木夺宋,虏清入关,神舟陆沉二百年有余,中国之见灭于满清初非满人能灭之,能有之也因有汉奸以作虎怅,残同胞媚异种,始有吴三桂洪承畴,继有曾国藩袁世凯以为厉。今率堂堂之师,征讨汉贼袁氏筑共和之体,或免于我子子孙孙被异族奴役。---- 《讨汉贼袁世凯檄文》- DOMContentLoaded事件:此时浏览器已经完全加载了HTML文件,并且DOM树已经生成好了。- Load事件:此时浏览器已经将所有的资源都加载完毕,可以正确读取页面中的资源。补充知识:Electron 生命周期。

Xcode 15构建问题

将ENABLE_USER_SCRIPT_SANDBOXING设为“no”即可!

OpenVINO应用案例:部署YOLO模型到边缘计算摄像头_openvino yolo-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏23次。一、实现路径通过OpenVINO部署YOLO模型到边缘计算摄像头,其实现路径为:训练(YOLO)->转换(OpenVINO)->部署运行(OpenNCC)。二、具体步骤1、训练YOLO模型1.1 安装环境依赖有关安装详情请参阅 https://github.com/AlexeyAB/darknet#requirements-for-windows-linux-and-macos 。1.2 编译训练工具git clone https://github.com/AlexeyAB/da_openvino yolo

推荐文章

热门文章

相关标签