Golang 怎么让接收到的时间戳自动转为time?使用的gin

使用的框架是gingorm。现在前端请求接口是上传的是个时间戳。应该怎么处理才能让接收到的时间戳自动转为time.Time. 前端传过来的是一个json数据。当使用ShouldBindJSON的时候,解析就出问题了。

阅读 16.2k
5 个回答

在使用的时候自定义一个类型 TimeStamp实现相应的方法即可:代码如下:

package time

import (
    "database/sql/driver"
    "fmt"
    "strconv"
    "time"
)

type TimeStamp time.Time

func (ts TimeStamp) MarshalJSON() ([]byte, error) {
    origin := time.Time(ts)
    return []byte(strconv.FormatInt(origin.UnixNano()/1000000, 10)), nil
}

func (ts *TimeStamp) ToTime() time.Time {
    return time.Time(*ts)
}

// UnmarshalJSON implements the json.Unmarshaler interface.
// The time is expected to be a quoted string in RFC 3339 format.
func (ts *TimeStamp) UnmarshalJSON(data []byte) error {
    if string(data) == "null" {
        return nil
    }
    millis, err := strconv.ParseInt(string(data), 10, 64)

    *ts = TimeStamp(time.Unix(0, millis*int64(time.Millisecond)))
    return err
}

func (ts TimeStamp) ToString() string {
    return ts.ToTime().Format("2006-01-02 15:04:05")
}

func (ts TimeStamp) Value() (driver.Value, error) {
    var zeroTime time.Time
    var ti = time.Time(ts)
    if ti.UnixNano() == zeroTime.UnixNano() {
        return nil, nil
    }
    return ti, nil
}

// Scan valueof time.Time
func (ts *TimeStamp) Scan(v interface{}) error {
    value, ok := v.(time.Time)
    if ok {
        *ts = TimeStamp(value)
        return nil
    }
    //i, err = strconv.ParseInt(sc, 10, 64)

    return fmt.Errorf("can not convert %v to timestamp", v)
}

func Unix(sec int64, nsec int64) Time

这个没有自动转的办法吧,一般都是前后端商量好用什么格式的,如果不一致,你只能接收了之后自己转了,或者用Gorm的钩子:

type A struct{
    ID uint64
    CreatedUnix uinit64 `json:"CreatedAt" sql:"-"`
    CreatedAt *time.Time `json:"-"`
}

func (a *A) BeforeSave() error {
    t := time.Unix(a.CreatedUnix, 0)
    a.CreatedAt = &t
    return nil
}

JSON传过来是什么类型,你就只能定义什么类型,没有自动转换这个说法,只能转为数字之后再手动转为time.Time

新手上路,请多包涵

我在用 gin@ v1.4 版本, json 是支持直接转换成 time.Time 类型的。
不过不支持自定义数据格式。即只能支持 RFC3339 格式(即 "2006-01-02T15:04:05Z07:00")的类型。

推荐问题
宣传栏