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

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

在使用的时候自定义一个类型 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")的类型。

回答

以上是 【go】Golang 怎么让接收到的时间戳自动转为time?使用的gin 的全部内容, 来源链接: www.h5w3.com/112713.html

回到顶部