Datetime 为什么JSON绑定中的时间格式会发生变化?

Datetime 为什么JSON绑定中的时间格式会发生变化?,datetime,go,time,couchbase,gocb,Datetime,Go,Time,Couchbase,Gocb,我创建了一个结构,它包含两个time.time格式的字段,用json标记命名:start\u time和end\u time 当我试图使用gin框架通过HTTP发送PUT请求以更新这些值时,我发送的时间格式会在sent结构中发生更改。 我要发送的内容: curl -X PUT -H 'Content-Type: application/json' http://my_address -d '{ "start_time": "2021-04-27T22:

我创建了一个结构,它包含两个time.time格式的字段,用json标记命名:start\u time和end\u time

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

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",
另一方面,, 我将结构保存在couchbase中,并且作为查询的返回值,我将发送回文档(我的结构):

我的问题是:

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\""}
顺便说一下,正如我所说的,更新是在没有错误的情况下完成的(查询执行时没有错误)。
那么我该怎么处理它呢?

您是如何生成此查询的:

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
),而不是默认的
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
如果格式化时间有问题,请阅读文档


正如@MrFuppes所评论的,如果您需要自定义JSON输出格式,请阅读此

您可以说“它接收到什么:”如何确定它接收到什么?我在绑定后使用fmt.Println()将其内联记录在代码中。并且它是这样存储的。
MyStruct
字段的类型是
time.time
“2021-04-27 22:24:31+0000 UTC”
是将该类型封送到json.time.time时的标准字符串格式(),其字符串表示形式不同。time.time有一个默认的字符串表示形式,但如果不是您想要的,您必须选择您想要的,并使用time.time.Format生成相应的。相关:我很高兴这个答案适合您,但仅供参考,Couchbase中不要求日期采用该格式。它可以以您喜欢的任何格式存储(时间戳、组件数组、ISO 8601等)。这种格式对于您的客户端代码可能是必需的,但对于Couchbase则不是。@MatthewGroves您说得对,谢谢您指出这一点。
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