gin将响应的时间格式化 YYYY-MM-DD HH:MM:SS

gin将响应的时间格式化 YYYY-MM-DD HH:MM:SS

  • 创建model/time_type.go
go 复制代码
package model

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

// LocalTime 自定义时间类型(格式化为 YYYY-MM-DD HH:MM:SS)
type LocalTime time.Time

// 常量:时间格式化模板
const timeFormat = "2006-01-02 15:04:05"

// MarshalJSON 实现 JSON 序列化接口(返回格式化后的字符串)
func (t LocalTime) MarshalJSON() ([]byte, error) {
	// 将自定义时间类型转为 time.Time
	tt := time.Time(t)
	if tt.IsZero() {
		return []byte("null"), nil // 空时间返回 null
	}
	// 格式化时间为字符串并包裹双引号(JSON 字符串格式)
	return json.Marshal(tt.Format(timeFormat))
}

// UnmarshalJSON 实现 JSON 反序列化接口(接收格式化字符串转为时间)
func (t *LocalTime) UnmarshalJSON(data []byte) error {
	// 空值处理
	if string(data) == "null" {
		*t = LocalTime(time.Time{})
		return nil
	}
	// 解析字符串为时间
	tt, err := time.Parse(`"`+timeFormat+`"`, string(data))
	if err != nil {
		return err
	}
	*t = LocalTime(tt)
	return nil
}

// Value 实现 driver.Valuer 接口(数据库存储时的格式)
func (t LocalTime) Value() (driver.Value, error) {
	tt := time.Time(t)
	if tt.IsZero() {
		return nil, nil
	}
	return tt.Format(timeFormat), nil
}

// Scan 实现 sql.Scanner 接口(从数据库读取时解析为 LocalTime)
func (t *LocalTime) Scan(v interface{}) error {
	if v == nil {
		*t = LocalTime(time.Time{})
		return nil
	}
	switch v.(type) {
	case time.Time:
		*t = LocalTime(v.(time.Time))
	case []byte:
		tt, err := time.Parse(timeFormat, string(v.([]byte)))
		if err != nil {
			return err
		}
		*t = LocalTime(tt)
	case string:
		tt, err := time.Parse(timeFormat, v.(string))
		if err != nil {
			return err
		}
		*t = LocalTime(tt)
	default:
		return fmt.Errorf("不支持的时间类型:%T", v)
	}
	return nil
}

// String 实现 Stringer 接口(打印时返回格式化字符串)
func (t LocalTime) String() string {
	return time.Time(t).Format(timeFormat)
}
  • 修改create_atcreate_time 等时间字段的类型
go 复制代码
package model

import (
	"gorm.io/gorm"
)

type User struct {
	ID        uint64         `gorm:"primarykey;comment:用户ID" json:"id"`
	CreatedAt LocalTime      `gorm:"comment:创建时间" json:"created_at"`
	UpdatedAt LocalTime      `gorm:"comment:更新时间" json:"updated_at"`
	DeletedAt gorm.DeletedAt `gorm:"index;comment:删除时间" json:"deleted_at"` // 软删除
}
相关推荐
是梦终空12 分钟前
计算机毕业设计279—基于SpringBoot+Vue3校园商户意见反馈系统(源代码+数据库+17000字论文+ppt)
数据库·spring boot·vue·毕业设计·课程设计·毕业论文·源代码
TDengine (老段)35 分钟前
TDengine 索引使用指南 — 何时建、怎么建、怎么用
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
ATA888844 分钟前
企业数据库账号安全的技术解决方案
数据库·安全
DB哥讲数据库1 小时前
MySQL 8.4 安装教程:超详细图文讲解(附mysql安装包)
linux·数据库·mysql·centos
Databend1 小时前
AST Visitor API 迁移,怎么证明 AI 没改坏 SQL 语义?
数据库·ai编程
TDengine (老段)1 小时前
TDengine DDL 完整参考 — Database/STable/Table/Column/Tag
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
xlxxy_1 小时前
sap获取批次特性报表
java·linux·开发语言·前端·数据库·abap·mm
神秘的MT1 小时前
SQL Server 分页查询 ROW_NUMBER () OFFSET...FETCH游标(Cursor) 数据插入
数据库·sql·学习·c#·winform
栋***t1 小时前
从“工具”到“基建”,麦塔在线考试系统经历的时代变局与定位逻辑
java·大数据·数据库·开源软件·无纸化
SelectDB技术团队1 小时前
Agent 可观测性:Apache Doris / SelectDB 的技术能力、选型对比与实践
数据库·人工智能·agent·可观测·ai-native·apache doris·selectdb