英文:
How should I get string datetime from API and unmarshal it into struct time.Time field in Gonic?
问题
我使用gin context
来获取JSON数据并将其转换为struct
,这方面运行得很好。但是我在使用time.Time
作为字段类型时遇到了问题:
type User struct {
CreatedAt time.Time `json:"created_at"`
}
在gin
中,我使用ShouldBind
:
var user User
if err := c.ShouldBind(&user); err != nil {
c.JSON(200, g.H{})
return
}
我得到的错误是:
parsing time "2019-01-01T00:00:00" as "2006-01-02T15:04:05Z07:00": cannot parse "" as "Z07:00"
似乎需要时区段。我也尝试了Z00:00
,但仍然出现解析错误。
我该如何将类似于"2022-01-01 20:00:00"的日期时间转换为Go中的time.Time
,甚至带有时区?
英文:
I use gin context
to get json data and convert it into struct
, it works fine. But what I have issues with is using time.Time
as one of the field types:
type User struct {
CreatedAt time.Time `json:"created_at"`
}
In gin
I use ShouldBind
:
var user User
if err := c.ShouldBind(&user); err != nil {
c.JSON(200, g.H{})
return
}
The error I get is:
parsing time "2019-01-01T00:00:00" as "2006-01-02T15:04:05Z07:00": cannot parse "" as "Z07:00"
It seems that timezone segment is required. I also gave Z00:00
but again parse error raised.
How I can get datetime
like "2022-01-01 20:00:00" and convert it into time.Time
in Go or even with timezone?
答案1
得分: 0
func HandleTime(c *gin.Context) {
type User struct {
CreatedAt time.Time `json:"created_at" binding:"required" time_format:"2006-01-02T15:04:05Z07:00"`
}
var user User
fmt.Println(user.CreatedAt.String())
if err := c.ShouldBindJSON(&user); err != nil {
fmt.Println(err)
return
}
c.JSON(200, gin.H{
"created": user.CreatedAt.String(),
})
}
curl -X POST 'http://127.0.0.1:8092/${YOUR_PATH}' \
-H 'Content-Type: application/json' -d '{
"created_at": "2019-01-01T01:00:09+08:00"
}'
响应:
{
"created": "2019-01-01 01:00:09 +0800 CST"
}
在go doc中查看此示例:https://pkg.go.dev/time@go1.18.4#example-Parse
例如,RFC3339
布局 2006-01-02T15:04:05Z07:00 包含 Z 和时区偏移量,以处理两个有效选项:
- 2006-01-02T15:04:05Z
- 2006-01-02T15:04:05+07:00。
英文:
func HandleTime(c *gin.Context) {
type User struct {
CreatedAt time.Time `json:"created_at" binding:"required" time_format:"2006-01-02T15:04:05Z07:00"`
}
var user User
fmt.Println(user.CreatedAt.String())
if err := c.ShouldBindJSON(&user); err != nil {
fmt.Println(err)
return
}
c.JSON(200, gin.H{
"created": user.CreatedAt.String(),
})
}
curl -X POST 'http://127.0.0.1:8092/${YOUR_PATH}' \
-H 'Content-Type: application/json' -d '{
"created_at": "2019-01-01T01:00:09+08:00"
}'
Response:
{
"created": "2019-01-01 01:00:09 +0800 CST"
}
See this in go doc: https://pkg.go.dev/time@go1.18.4#example-Parse
For example the RFC3339
layout 2006-01-02T15:04:05Z07:00
contains both Z and a time zone offset in order to handle both valid options:
- 2006-01-02T15:04:05Z
- 2006-01-02T15:04:05+07:00.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论