猿问

编组 time.Time 到 unix 时间戳

我有这样的结构


type log struct {

    [...]

    Timestamp timestamp `json:"timestamp"`

}

我想将时间戳作为 unix 时间戳,而不是默认情况下执行的任何操作 ( 2018-09-21T19:31:03.291Z)


我试过像这样创建一个自定义类型:


type timestamp struct {

    time.Time

}


func (t timestamp) MarshalJSON() ([]byte, error) {

    return []byte(strconv.FormatInt(time.Time(t.Time).Unix(), 10)), nil

}


func (t *timestamp) UnmarshalJSON(data []byte) error {

    i, err := strconv.ParseInt(string(data[:]), 10, 64)

    if err != nil {

        return err

    }

    t = &timestamp{

        time.Unix(i, 0),

    }

    return nil

}

can not unmarshal timestamp into *main.timestamp但是我在尝试从数据库中读取时总是遇到错误。


for iter.Scan(&message.Text, &message.Timestamp) {


    userlogResult.Messages = append(userlogResult.Messages, message)

}

if err := iter.Close(); err != nil {

    log.Error(err)

}

它不能在这里解组时间戳。https://github.com/gocql/gocql/blob/799fb0373110eaa4e2e71dd32a9b5903f80dca8f/helpers.go#L30问题是它不使用 Unmarshall 函数。


编辑:我已经回答了我自己的问题。


HUH函数
浏览 106回答 3
3回答

大话西游666

在这里,当分配&timestamp{..}给 t 时,它正在更改指针,而不是它指向的值必须按如下方式更改func (t *timestamp) UnmarshalJSON(data []byte) error {    i, err := strconv.ParseInt(string(data[:]), 10, 64)    if err != nil {        return err    }    *t = timestamp{        time.Unix(i, 0),    }    return nil}编辑由于您在从数据库读取时未能解组,这不是因为 如果您使用的是 sql,则json.unmarshalling必须实施sql.Scanner

PIPIONE

我认为您的代码还可以-除了解组中的代码。您没有在实际错误所在的编组/解组位置显示代码。我让它在操场上工作。而不是这个(它改变了指针)t = &timestamp{  time.Unix(i, 0),}更改值t.Time = time.Unix(i,0)使用结构的主要功能fmt.Println("First Log...")l := log{Timestamp: timestamp{time.Now()}}fmt.Println(l)buf, err := json.Marshal(l)if err != nil {    panic(err)}fmt.Println("Marshalled to JSON...")fmt.Printf("%s\n", buf)var logCopy logif err := json.Unmarshal(buf, &logCopy); err != nil {    panic(err)}fmt.Println("UnMarshalled from JSON...")fmt.Println(logCopy)

繁花不似锦

好吧,在混淆了这里的很多人(抱歉)和我自己之后,我找到了解决方案。对 json 的编组现在只需要像这样修复 gocql 兼容性:var ts time.Timefor iter.Scan(&message.Text, &ts) {    message.Timestamp = timestamp{ts}    userlogResult.Messages = append(userlogResult.Messages, message)}
随时随地看视频慕课网APP

相关分类

Go
我要回答