为了账号安全,请及时绑定邮箱和手机立即绑定

编组 time.Time 到 unix 时间戳

编组 time.Time 到 unix 时间戳

Go
HUH函数 2023-04-10 10:39:01
我有这样的结构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 函数。编辑:我已经回答了我自己的问题。
查看完整描述

3 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

在这里,当分配&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


查看完整回答
反对 回复 2023-04-10
?
PIPIONE

TA贡献1829条经验 获得超9个赞

我认为您的代码还可以-除了解组中的代码。您没有在实际错误所在的编组/解组位置显示代码。

我让它在操场上工作。

而不是这个(它改变了指针)

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 log

if err := json.Unmarshal(buf, &logCopy); err != nil {

    panic(err)

}

fmt.Println("UnMarshalled from JSON...")

fmt.Println(logCopy)


查看完整回答
反对 回复 2023-04-10
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

好吧,在混淆了这里的很多人(抱歉)和我自己之后,我找到了解决方案。


对 json 的编组现在只需要像这样修复 gocql 兼容性:


var ts time.Time

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

    message.Timestamp = timestamp{ts}


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

}


查看完整回答
反对 回复 2023-04-10
  • 3 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信