全局格式化时间

全局格式化时间

1 遇到的问题

前台接收到的接口数据 时间不是常用的格式, 原因是序列化使用的 RFC3339 格式
输出来的字符串不是 2020-04-27 19:08:35

2 希望的结果

发到前台的数据,输出就是 2020-04-27 19:09:17的时间格式

3 尝试过的办法

type jsonTime time.Time

//实现它的json序列化方法
func (this jsonTime) MarshalJSON() ([]byte, error) {
    var stamp = fmt.Sprintf("\"%s\"", time.Time(this).Format("2006-01-02 15:04:05"))
    return []byte(stamp), nil
}

结构体中的时间都定义为 jsonTime 格式
就可以了, 但是有没有更简单的方法, 不修改结构体呢??

最佳答案

type下类型重新定义下序列化方法,另外格式化时间应该是前端显示处理的new Data.Format()就好了,具体格式由前端决定。

play.golang.org/p/9tOAw0zs6d6

package main

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

type Time time.Time

func (t Time) String() string {
    return time.Time(t).Format("2006-01-02")
}

func (t Time) MarshalJSON() ([]byte, error) {
    return []byte("\"" + t.String() + "\""), nil
}

type Info struct {
    LastTime Time `json:"lastime"`
}

func main() {
    info := &Info{Time(time.Now())}
    body, err := json.Marshal(info)
    fmt.Printf("%#v\n", info)
    fmt.Println(info.LastTime)
    fmt.Println(string(body), err)
}
// &main.Info{LastTime:main.Time{wall:0xbab699fc00000000, ext:1, loc:(*time.Location)(0x5affe0)}}
// 2009-11-10
// {"lastime":"2009-11-10"} <nil>
3年前 评论
go (楼主) 3年前
讨论数量: 1

type下类型重新定义下序列化方法,另外格式化时间应该是前端显示处理的new Data.Format()就好了,具体格式由前端决定。

play.golang.org/p/9tOAw0zs6d6

package main

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

type Time time.Time

func (t Time) String() string {
    return time.Time(t).Format("2006-01-02")
}

func (t Time) MarshalJSON() ([]byte, error) {
    return []byte("\"" + t.String() + "\""), nil
}

type Info struct {
    LastTime Time `json:"lastime"`
}

func main() {
    info := &Info{Time(time.Now())}
    body, err := json.Marshal(info)
    fmt.Printf("%#v\n", info)
    fmt.Println(info.LastTime)
    fmt.Println(string(body), err)
}
// &main.Info{LastTime:main.Time{wall:0xbab699fc00000000, ext:1, loc:(*time.Location)(0x5affe0)}}
// 2009-11-10
// {"lastime":"2009-11-10"} <nil>
3年前 评论
go (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!