ibeautiful
来自 golang.org/pkg/time/#Time.MarshalJSON:时间是 RFC 3339 格式的带引号的字符串,如果存在则添加亚秒级精度。零是无关紧要的,所以它们被省略了。如果这对您不起作用,请实施您自己的 MarshalJSON 方法:package mainimport ( "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"))}