Golang Go语言中 gin 返回 json time.Time 的问题
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 个疑问
- 为什么会带上毫秒、能取消掉吗?
- 有没有类似 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
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
的序列化格式,你可以使用以下几种方法:
-
使用结构体标签: 在你的结构体中,为
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/v10
的jsoniter
或自定义的 JSON 序列化逻辑。 -
全局设置 JSON 序列化器: 使用
github.com/json-iterator/go
这样的库,它支持自定义时间格式。你可以替换 Gin 默认的 JSON 序列化器为这个库。 -
自定义序列化方法: 为结构体实现
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
的序列化。