mongodb - 如何在json中响应时间毫秒为零
问题描述
在我的 mongodb 中,我有字段
"createdAt" : ISODate("2018-10-02T01:17:58.000Z")
我有结构有字段
CreatedAt time.Time `json:"createdAt" bson:"createdAt"`
但是当我通过 json 响应时,它缺少我预期的零毫秒
"createdAt": "2018-10-02T01:17:58.000Z"
但是收到了
"createdAt": "2018-10-02T01:17:58Z"
解决方案
来自 golang.org/pkg/time/#Time.MarshalJSON:
时间是 RFC 3339 格式的带引号的字符串,如果存在则添加亚秒精度。
零是微不足道的,所以它们被省略了。如果这对您不起作用,请实现您自己的 MarshalJSON 方法:
package main
import (
"encoding/json"
"fmt"
"time"
)
type MyType struct {
Foo string
CreatedAt time.Time `json:"-" bson:"createdAt"`
}
func (t MyType) MarshalJSON() ([]byte, error) {
type MyType_ MyType // prevent recursion
return json.Marshal(struct {
MyType_
CreatedAt string `json:"createdAt"` // Override time field
}{
MyType_(t),
t.CreatedAt.Format("2006-01-02T15:04:05.000Z07:00"),
})
}
func main() {
t := MyType{
Foo: "bar",
CreatedAt: time.Date(2018, 10, 2, 12, 13, 14, 0, time.UTC),
}
b, err := json.MarshalIndent(t, "", " ")
fmt.Println(err, string(b))
t.CreatedAt = t.CreatedAt.Add(123456 * time.Microsecond)
b, err = json.MarshalIndent(t, "", " ")
fmt.Println(err, string(b))
}
// Output:
// <nil> {
// "Foo": "bar",
// "T": "2018-10-02T12:13:14.000Z"
// }
// <nil> {
// "Foo": "bar",
// "T": "2018-10-02T12:13:14.123Z"
// }
https://play.golang.org/p/bmDk1pejGPS
如果您必须在许多地方执行此操作,则创建自己的时间类型可能是值得的(但是,如果您必须进行日期数学,那将很不方便):
type MyType struct {
Foo string
CreatedAt MyTime `json:"createdAt" bson:"createdAt"`
}
type MyTime struct {
time.Time
}
func (t MyTime) MarshalJSON() ([]byte, error) {
return json.Marshal(t.Format("2006-01-02T15:04:05.000Z07:00"))
}
推荐阅读
- sql - 从 epoc 时间戳列中仅检索具有今天日期的记录
- r - 为什么`devtools::document()`会在函数定义为空的`setMethod`上跳闸?
- bash - 用于设置目录和文件权限的 bash 脚本
- php - 如何检查一个日期是否在其他日期之间?
- python - 无法弄清楚为什么我会收到 UnboundLocalError
- mysql - 使用本地客户端连接到 VPC 中的 AWS RDS 实例
- java - 子类的超类方法 Java
- function - 如何让 Azure Function 运行超过 10 分钟
- wordpress - 无法使用 woocommerce API 创建 webhook
- linux - Linux 中的 Delphi RIO PAServer 引发 IOError 11