0

我创建了一个结构,它包含两个time.Time格式的字段,用 json 标签命名:start_timeend_time

type MyStruct struct {

   StartTime  time.Time `json:"start_time"`
   EndTime    time.Time `json:"end_time"`
}

当我尝试使用 gin 框架通过 HTTP 发送 PUT 请求来更新这些值时,我发送的时间格式会在发送的结构中发生变化。我要发送的内容:

curl    -X  PUT   -H  'Content-Type: application/json'
http://my_address -d '{
"start_time": "2021-04-27T22:24:31Z",
"end_time": "2021-11-01T22:24:31Z"
}'

它收到什么:

start_time="2021-04-27 22:24:31 +0000 UTC",
end_time="2021-11-01 22:24:31 +0000 UTC",

另一方面,我将结构保存在沙发库中,并作为查询的返回值,我将文档(我的结构)发回:

我的查询:

Update BucketName as e
set start_time="2021-04-27 22:24:31 +0000 UTC",
end_time="2021-11-01 22:24:31 +0000 UTC" where ( my document equality condition)
returning e

它执行没有错误。当我试图读取返回的结构时,

我的阅读代码:

var s domain.MyStructSample //                                                                                                               
    err = result.One(&s)
    if err != nil { 
     if err == gocb.ErrNoResult {
        return nil, errors.New("there is no result")
      }
      logger.ZSLogger.Errorf("error on update one item from my struct with error :%s", err)
      return nil, err
    }
      

gocb 在这些时间项上生成错误,这是错误:

"message":"error on update one item from my struct  with error :parsing time \"\"2021-11-01 22:24:31 +0000 UTC\"\" as \"\"2006-01-02T15:04:05Z07:00\"\": cannot parse \" 22:24:31 +0000 UTC\"\" as \"T\""}

顺便说一句,正如我所说,更新完成时没有错误(查询执行时没有错误)。那我该怎么办呢?

4

1 回答 1

2

您是如何生成此查询的:

Update BucketName as e
set start_time="2021-04-27 22:24:31 +0000 UTC",
end_time="2021-11-01 22:24:31 +0000 UTC" where ( my document equality condition)
returning e

正如错误所说,存储在 couchbase 中的时间数据应该是格式 RFC3339 ( 2006-01-02T15:04:05Z07:00) 而不是 default 2006-01-02 15:04:05 -0700 MST,所以也许你应该使用查询插入数据:

Update BucketName as e
set start_time="2021-04-27T22:24:31Z07:00",
end_time="2021-11-01T22:24:31Z07:00" where ( my document equality condition)
returning e

如果您在格式化时间时遇到问题,请阅读文档https://golang.cafe/blog/golang-time-format-example.html

而且,正如@MrFuppes 评论的那样,如果您需要自定义 JSON 输出格式,请阅读这篇如何在传出 JSON 中格式化时间戳

于 2021-04-29T07:07:35.027 回答