【Golang】让Json自动支持DateTime格式和ISO8601格式的时间

默认的json使用的时间格式是 json.Time3339,这个时间的格式为:2006-01-02T15:04:05Z07:00

而我们常用的格式:DateTime:2006-01-02 15:04:05 和 ISO8601:2006-01-02T15:04:05+0800

一、DataTime 解析

库:github.com/reatang/go-json-datetime

示例代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import(
    "fmt"
    "encoding/json"
    jsondt "github.com/reatang/go-json-datetime"
)

type Data struct {
    CreateTime jsondt.DateTime `json:"create_time"`
}

func main() {
    j1 := `{"create_time": "2024-07-10 18:52:19"}`

    var d Data
    err := json.Unmarshal(j1, &d)
    if err != nil {
        panic(err)
    }

    fmt.Println(d.CreateTime.Format(time.DateTime))
}

二、ISO8601 解析

有效的 ISO8601时间格式为:

  • 仅日期:

    • 2023-12-05
  • 日期和时间(不含时区):

    • 2023-12-05T14:30:00
  • 日期和时间(含时区):

    • 2023-12-05T14:30:00Z (Z 表示 UTC 时间)
    • 2023-12-05T14:30:00+08:00 (+08:00 表示东八区时间)
  • 仅时间(不含日期):

    • 14:30:00
    • 14:30:00.123 (包含毫秒)
  • 周日期:

    • 2023-W50 (表示 2023 年的第 50 周)
    • 2023-W50-2 (表示 2023 年第 50 周的第 2 天)

库:github.com/relvacode/iso8601

示例代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
	"encoding/json"
	"fmt"
	"time"

	"github.com/relvacode/iso8601"
)

type Data struct {
	CreateTime iso8601.Time `json:"create_time"`
}

func main() {
	j1 := `{"create_time":"2017-04-24T09:41:34+0800"}`
	var data Data
	err = json.Unmarshal([]byte(j1), &data)
	if err != nil {
		panic(err)
	}

	fmt.Println(data)
}