Go time.Time.UTC () иногда дает 7 цифр, иногда 9 - PullRequest
0 голосов
/ 10 мая 2019

Я вижу некоторые несоответствия в выводе метода time.Now().UTC(). Иногда я получаю это:

"created": "2018-10-18T08:50:33.636433623Z"

И иногда я получаю это:

"created": "2019-05-10T08:16:07.871395Z",

Разница заключается в количестве цифр в последней части. Почему это не соответствует? Кто-нибудь знает, как я могу отладить / убедиться, что он действительно согласован?

1 Ответ

8 голосов
/ 10 мая 2019

Когда вы видите меньше цифр в дробной части секунды, это потому, что он будет заканчиваться нулями, а их пропуск не меняет значение времени.

Похоже, вы генерировали эти выходные данные путем маршалинга некоторых значений (содержащих метки времени) в JSON. JSON-представление time.Time «управляется» как Time.MarshalJSON(), что:

Время - это строка в кавычках в формате RFC 3339, с точностью до секунды, если таковая имеется.

См. Этот пример:

t1 := time.Date(2019, 5, 10, 11, 12, 13, 123456789, time.UTC)
fmt.Println(t1)

t2 := time.Date(2019, 5, 10, 11, 12, 13, 123456700, time.UTC)
fmt.Println(t2)

Это выводит:

2019-05-10 11:12:13.123456789 +0000 UTC
2019-05-10 11:12:13.1234567 +0000 UTC

Марширование их в JSON:

data, err := json.Marshal(t1)
fmt.Println(string(data), err)
data, err = json.Marshal(t2)
fmt.Println(string(data), err)

Дает вывод:

"2019-05-10T11:12:13.123456789Z" <nil>
"2019-05-10T11:12:13.1234567Z" <nil>

Если вы хотите, чтобы нули появлялись в выходных данных, используйте time.Format() и используйте столько нулей в строке формата для вторых дробей, сколько цифр вы хотите в выходных данных. Это задокументировано в time пакет: константы :

Десятичная точка, за которой следует один или несколько нулей, представляет долю секунды, , напечатанную с указанным количеством десятичных знаков . Десятичная точка, за которой следуют одна или несколько девяток, представляет дробную секунду, напечатанную с заданным количеством десятичных знаков, с удалением завершающих нулей .

Time.MarshalJSON() использует time.RFC3339Nano, что:

RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"

так что завершающие нули удаляются. Если вы используете нули вместо девяток в формате:

fmt.Println(t2.Format("2006-01-02T15:04:05.000000000Z"))

Это выводит:

2019-05-10T11:12:13.123456700Z

Попробуйте примеры на Go Playground .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...