Я попытался разобрать строку даты "2014-09-12T11:45:26.371Z"
в Go.
Код
layout := "2014-09-12T11:45:26.371Z"
str := "2014-11-12T11:45:26.371Z"
t, err := time.Parse(layout , str)
Я получил эту ошибку:
время разбора "2014-11-12T11: 47: 39.489Z": месяц вне диапазона
Как я могу разобрать эту строку даты?
2006-01-02T15:04:05.000Z
из-за какого-то безумного стандартаОтветы:
Используйте точные номера макетов, описанные здесь, и хороший пост в блоге здесь .
так:
дает:
Я знаю. Сногсшибательно. Также поймал меня впервые. Go просто не использует абстрактный синтаксис для компонентов datetime (
YYYY-MM-DD
), но эти точные числа (я думаю, время первого коммита goNope, в соответствии с этим . Кто-нибудь знает?).источник
Макет использования действительно «
2006-01-02T15:04:05.000Z
» описано в RickyA «s ответ .Это не "время первого коммита", а скорее мнемонический способ запоминания указанного макета.
Смотрите пкг / время :
(1,2,3,4,5,6,7, при условии, что вы помните, что 1 для месяца, а 2 для дня, что непросто для европейца, такого как я, в формате даты день-месяц)
Как показано в « time.parse: почему golang неправильно анализирует время? », Этот макет (с использованием 1,2,3,4,5,6,7) должен точно соблюдаться .
источник
strftime
FTW.Как и ответили, но чтобы сохранить ввод
"2006-01-02T15:04:05.000Z"
для макета, вы можете использовать константу пакета RFC3339 .https://play.golang.org/p/Dgu2ZvHwTh
источник
2006-01-02T15:04:05.000Z
и упоминают, что Go такжеtime.RFC3339
будет работать. Ноtime.RFC3339 = "2006-01-02T15:04:05Z07:00"
. Являются ли эти два формата абсолютно эквивалентными, еслиtime.Parse
иtime.ParseInLocation
что делать?Я предлагаю использовать постоянную time.RFC3339 из пакета времени. Вы можете проверить другие константы из пакета времени. https://golang.org/pkg/time/#pkg-constants
источник
Это довольно поздно для вечеринки, и на самом деле ничего не сказано о том, что еще не было сказано в той или иной форме, в основном по ссылкам выше, но я хотел дать резюме TL; DR тем, у кого меньше внимания:
Дата и время строки формата go очень важны. Это как Го знает, какое поле какое. Они обычно 1-9 слева направо следующим образом:
Поэтому не пишите «01-05-15» в качестве формата даты, если вы не хотите «Месяц-Второй-Час»
(... опять же, это было в основном резюме выше.)
источник
Это может быть слишком поздно, но это для людей, которые могут наткнуться на эту проблему и могут захотеть использовать внешний пакет для разбора строки даты.
Я попытался найти библиотеки, и я нашел это:
https://github.com/araddon/dateparse
Пример из README:
источник
Если вы работали с форматированием времени / даты / анализом на других языках, вы могли заметить, что на других языках используются специальные заполнители для форматирования времени / даты. Например, для использования языка рубин
и т. д. Golang вместо кодов, таких как выше, использует заполнители формата даты и времени, которые выглядят только как дата и время. Go использует стандартное время, которое:
Так что, если вы заметили, Go использует
Поэтому, например, для синтаксического анализа 2020-01-29 строка макета должна быть 06-01-02 или 2006-01-02.
Вы можете обратиться к полной таблице макета заполнителя по этой ссылке - https://golangbyexample.com/parse-time-in-golang/
источник