Осторожно, впереди длинный ответ
(tl; dr) использовать:
ts, err := time.Parse("2006-01-02T15:04:05-0700", currentTime)
ts.Format(time.RFC3339)
Мне действительно нравится идти документация, и вы должны сделать:)
Все из https://golang.org/pkg/time/#pkg-constants
RFC3339 = "2006-01-02T15:04:05Z07:00"
Некоторые допустимые макеты являются недопустимыми значениями времени для time.Parse из-за таких форматов, как _ для пробела и Z для информации о зоне
Это означает, что вы не можете анализировать +0000
с макетом Z07:00
.
Также:
В качестве эталонного времени, используемого в макетах, используется конкретное время:
Mon Jan 2 15:04:05 MST 2006
, что соответствует времени Unix 1136239445. Поскольку MST - это GMT-0700, эталонное время можно рассматривать как
01/02 03:04:05PM '06 -0700
. Можно анализировать формат числовых смещений часовых поясов.следующим образом:
-0700 ±hhmm
-07:00 ±hh:mm
-07 ±hh
Или замена знака в формате на Z
:
Z0700 Z or ±hhmm
Z07:00 Z or ±hh:mm
Z07 Z or ±hh
фракция:
Из этого примера https://play.golang.org/p/V9ubSN6gTdG
// Если дробь в макете равна 9 с, конечные нули сбрасываются.
do("9s for fraction", "15:04:05.99999999", "11:06:39.1234")
Таким образом, выможет разобрать это лиke:
ts, err := time.Parse("2006-01-02T15:04:05.999-0700", currentTime)
Кроме того, из документа
Десятичная точка, за которой следует один или несколько нулей, представляет дробную секунду, напечатанную с заданным количеством десятичных знаков.Десятичная точка, за которой следуют одна или несколько девяток, представляет дробную секунду, напечатанную с заданным количеством десятичных знаков, с удалением завершающих нулей.При синтаксическом анализе (только) вход может содержать дробное второе поле сразу после поля секунд, , даже если макет не означает его присутствие . В этом случае десятичная точка, за которой следует максимальный ряд цифр, анализируется как доли секунды.
Это означает, что вы можете пропустить десятичные точки из макета, и это будетсинтаксический анализ
ts, err := time.Parse("2006-01-02T15:04:05-0700", currentTime)
Для получения времени в UTC
просто напишите ts.UTC()
И для форматирования его в RFC3339 вы можете использовать
ts.Format(time.RFC3339)
Пример
currentTime := "2018-12-17T17:02:04.123+0530"
ts, err := time.Parse("2006-01-02T15:04:05-0700", currentTime)
if err != nil {
panic(err)
}
fmt.Println("ts: ", ts)
fmt.Println("ts in utc: ", ts.UTC())
fmt.Println("RFC3339: ", ts.Format(time.RFC3339))
// output
// ts: 2018-12-17 17:02:04.123 +0530 +0530
// ts in utc: 2018-12-17 11:32:04.123 +0000 UTC
// RFC3339: 2018-12-17T17:02:04+05:30
детская площадка: https://play.golang.org/p/vfERDm_YINb