golang json格式化自定义日期格式


本文摘自网络,作者,侵删。

go 的time.Time,在json序列化是默认 2006-01-02T15:04:05Z07:00 的格式,十分不便,

encoding/json包在序列化和反序列化的时候分别调用encode.go 下的Marshaler接口的MarshalJSON方法和decode.go下的Unmarshaler接口的UnmarshalJSON方法,只要类型分别实现这两个接口即可

这里我需要序列化的时候转为日期格式,反序列化显示为时间戳格式

package utils

import (
    "errors"
    "time"
)

type TimeStamp int64

const CUS_TIME_FORMAT = "2006-01-02 15:04"

func (ts TimeStamp) MarshalJSON()([]byte,error){
    t := time.Unix(int64(ts),0)
    if y := t.Year(); y < 0 || y >= 10000 {
        return nil, errors.New("Time.MarshalJSON: year outside of range [0,9999]")
    }
    b := make([]byte, 0, len(CUS_TIME_FORMAT)+2)
    b = append(b, '"')
    b = t.AppendFormat(b, CUS_TIME_FORMAT)
    b = append(b, '"')
    return b, nil
}

func (ts *TimeStamp) UnmarshalJSON(data []byte) error{
    if string(data) == "null" {
        return nil
    }
    parseTime, err := time.Parse(`"`+CUS_TIME_FORMAT+`"`, string(data))
    if err!=nil{
        return err
    }
    *ts = TimeStamp(parseTime.Unix())
    return nil
}

以上这段代码大部分来自go/src/time/time.go, 只是将日期格式稍作修改

需要注意的是在UnmarshalJSON方法中,string(data) 的字符格式为""2006-01-02 15:04:05""这样的格式,原因是根据RFC4627 json标准,序列化后的在传输中都是字符串格式,在data 里面就已经包含json的字符串的 " 如果是数字1,string(data)解析的数据是"1",如果是字符串,就会出现两个引号


本文来自:简书

感谢作者:linqining

查看原文:golang json格式化自定义日期格式

相关阅读 >>

Golang并发原语之-信号量semaphore

Golang 数组存的是什么

Golang xorm mysql代码生成器(java,Go

聊聊promtail的positions

Golang如何接收前端的参数

Golang1.16新特性速览

Golang中main中panic和后续panic处理,以及新开协程的影响

Golang官方限流器的用法详解

Go modules构建项目

手撸Golang 基本数据结构与算法 图的最短路径  狄克斯特拉算法

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...