Как я могу время отклика в миллисекундах в 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"

Не могли бы вы показать код, который вы используете для создания и получения этих значений?

Schwern 02.10.2018 03:43

Я использую mgo, например: `` userCol.FindId (userID) .One (& result) ''

Minh Thuận 02.10.2018 04:30

Я думаю, это зависит от того, как пойдет время lang marshal json.

Minh Thuận 02.10.2018 04:31

Можете ли вы создать Минимальный, полный и проверяемый пример, который демонстрирует проблему, и редактировать вопрос, чтобы включить ее?

Schwern 02.10.2018 04:53
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
4
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из golang.org/pkg/time/#Time.MarshalJSON:

The time is a quoted string in RFC 3339 format, with sub-second precision added if present.

Нули не имеют значения, поэтому их опускаем. Если это не сработает для вас, реализуйте свой собственный метод 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"))
}

Спасибо, этот ответ такой ясный. Ты только что спас мне жизнь =))

Minh Thuận 02.10.2018 15:42

Другие вопросы по теме