Golang Go语言中 gin 返回 json time.Time 的问题

发布于 1周前 作者 nodeper 来自 Go语言
r := gin.Default()
r.GET("/time", func(c *gin.Context) {
	c.JSON( http.StatusOK, gin.H{
		"now": time.Now(),
	})
})

返回

{
    "now": "2022-11-17T14:31:44.6111772+08:00"
}

就想定义 now 为 time.Time 不想定义为 string 然后 format

有 2 个疑问

  1. 为什么会带上毫秒、能取消掉吗?
  2. 有没有类似 spring boot 中的
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss

直接全局替换


Golang Go语言中 gin 返回 json time.Time 的问题

更多关于Golang Go语言中 gin 返回 json time.Time 的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

13 回复

time.Now().Format(“22006-01-02 15:04:05”)

更多关于Golang Go语言中 gin 返回 json time.Time 的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


写个返回 NowTimeStr 的函数?

就想定义 now 为 time.Time 不想定义为 string 然后 format
---------

你想马儿跑还不给吃草??

总要改一个地方。

可以这样:

type MyTime time.Time

func(mt *MyTime) Marshal() ([]byte,error) {
返回你想要的格式
}


然后 json 里定义 now 为 MyTime 类型。

年数多了个 2 吧。。

#4 打多了一个 2

> 就想定义 now 为 time.Time 不想定义为 string 然后 format
这都哪跟哪啊? json.Marshaler 学了吗?

猜测可能是因为,json 并没有 time.Time 类型,在序列化的时候分配了默认的 String 类型,time.Time 转换为 string 的时候,会自动使用 time 实现的 string()方法,就得到了上面的结果

自定义一个 time 类型,自己写 marshal 和 unmarshal

https://segmentfault.com/a/1190000022264001

time.Time 的处理逻辑中会按照 Marshaler 接口实现

time.Time 就是 nano 时间戳加时区嘛。json 是要序列化成可读的啊。你不想要毫秒,就直接 parse 成字符串啊

默认的 JSON 序列化用的 RFC3339Nano ,反序列化用的 RFC3339 ,不满意的话就自己重写

在 Go 语言中使用 Gin 框架返回 JSON 数据时,处理 time.Time 类型的数据确实是一个常见问题。默认情况下,time.Time 类型会被序列化为 RFC3339 格式的字符串,这可能会不符合某些 API 的需求或前端展示的要求。

为了自定义 time.Time 的序列化格式,你可以使用以下几种方法:

  1. 使用结构体标签: 在你的结构体中,为 time.Time 类型的字段添加 JSON 标签,并指定格式。例如:

    type MyStruct struct {
        CreatedAt time.Time `json:"created_at,omitempty" format:"2006-01-02 15:04:05"`
    }
    

    注意:标准库 encoding/json 不支持自定义时间格式标签,这需要使用第三方库如 github.com/go-playground/validator/v10jsoniter 或自定义的 JSON 序列化逻辑。

  2. 全局设置 JSON 序列化器: 使用 github.com/json-iterator/go 这样的库,它支持自定义时间格式。你可以替换 Gin 默认的 JSON 序列化器为这个库。

  3. 自定义序列化方法: 为结构体实现 json.Marshaler 接口,自定义序列化逻辑。例如:

    func (m MyStruct) MarshalJSON() ([]byte, error) {
        type Alias MyStruct
        a := &struct {
            CreatedAt string `json:"created_at"`
            *Alias
        }{
            CreatedAt: m.CreatedAt.Format("2006-01-02 15:04:05"),
            Alias:     (*Alias)(&m),
        }
        return json.Marshal(a)
    }
    

选择最适合你项目需求的方法来处理 time.Time 的序列化。

回到顶部