Próbowałem przeanalizować ciąg daty "2014-09-12T11:45:26.371Z"
w Go.
Kod
layout := "2014-09-12T11:45:26.371Z"
str := "2014-11-12T11:45:26.371Z"
t, err := time.Parse(layout , str)
Mam ten błąd:
czas analizy „2014-11-12T11: 47: 39.489Z”: miesiąc poza zakresem
Jak mogę przeanalizować ten ciąg daty?
2006-01-02T15:04:05.000Z
spowodowany jakimś szalonym standardemOdpowiedzi:
Użyj dokładnych numerów układów opisanych tutaj i ładnego posta na blogu tutaj .
więc:
daje:
Wiem. Zadziwiające. Złapał mnie też pierwszy raz. Go po prostu nie używa abstrakcyjnej składni dla składników datetime (
YYYY-MM-DD
), ale te dokładne liczby (myślę, że czas pierwszego zatwierdzenia go nie, zgodnie z tym . Czy ktoś wie?).źródło
Układ do stosowania jest rzeczywiście „
2006-01-02T15:04:05.000Z
” opisany w RickyA „s odpowiedź .To nie jest „czas pierwszego zatwierdzenia go”, ale raczej mnemoniczny sposób zapamiętania wspomnianego układu.
Zobacz opakowanie / czas :
(1, 2, 3, 4, 5, 6, 7, pod warunkiem, że pamiętasz, że 1 oznacza miesiąc, a 2 dzień, co nie jest łatwe dla Europejczyka takiego jak ja, używanego do formatu dzień-miesiąc)
Jak pokazano w „ time.parse: dlaczego golang niepoprawnie analizuje czas? ”, Ten układ (używając 1,2,3,4,5,6,7) musi być dokładnie przestrzegany .
źródło
strftime
FTW.Odpowiedziałem, ale aby zaoszczędzić na wpisywaniu
"2006-01-02T15:04:05.000Z"
dla układu, możesz użyć stałej pakietu RFC3339 .https://play.golang.org/p/Dgu2ZvHwTh
źródło
2006-01-02T15:04:05.000Z
i wspomina, że Gotime.RFC3339
również będzie działać. Aletime.RFC3339 = "2006-01-02T15:04:05Z07:00"
. Czy te dwa formaty są dokładnie równoważne, jeśli chodzi o to, cotime.Parse
itime.ParseInLocation
będą robić?Zasugeruję użycie stałej time.RFC3339 z pakietu time. Możesz sprawdzić inne stałe z pakietu czasowego. https://golang.org/pkg/time/#pkg-constants
źródło
To dość późno na imprezę i tak naprawdę nie mówię niczego, co nie zostało już powiedziane w takiej czy innej formie, głównie za pośrednictwem powyższych linków, ale chciałem dać podsumowanie TL; DR tym, którzy mają mniejszą uwagę:
Data i godzina ciągu formatu go są bardzo ważne. W ten sposób Go wie, które pole jest które. Zazwyczaj są one od 1 do 9 od lewej do prawej w następujący sposób:
Dlatego nie pisz „01-05-15” jako formatu daty, chyba że chcesz „Miesiąc-Druga-Godzina”
(... znowu, było to w zasadzie podsumowanie powyższego.)
źródło
To może być bardzo późne, ale to jest dla osób, które mogą natknąć się na ten problem i mogą chcieć użyć zewnętrznego pakietu do analizy ciągu daty.
Próbowałem poszukać bibliotek i znalazłem tę:
https://github.com/araddon/dateparse
Przykład z README:
źródło
Jeśli pracowałeś z formatowaniem / analizowaniem czasu / daty w innych językach, być może zauważyłeś, że inne języki używają specjalnych symboli zastępczych do formatowania godziny / daty. Na przykład używa języka ruby
itd. Golang, zamiast używać kodów takich jak powyżej, używa symboli zastępczych formatu daty i czasu, które wyglądają tylko jak data i godzina. Go używa czasu standardowego, czyli:
Więc jeśli zauważysz, że Go używa
Dlatego na przykład podczas analizowania 2020-01-29 ciąg układu powinien mieć postać 06-01-02 lub 2006-01-02.
Możesz zapoznać się z pełną tabelą układu zastępczego pod tym linkiem - https://golangbyexample.com/parse-time-in-golang/
źródło