Преобразовать метку времени в формат ISO в Голанге - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь преобразовать метку времени 2018-12-17T15: 03: 49.000 + 0000 в формат ISO в golang, но получаю сообщение об ошибке cannot parse "+0000" as "Z07:00"

Это то, что я пробовал

ts, err := time.Parse(time.RFC3339, currentTime)

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Осторожно, впереди длинный ответ

(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

0 голосов
/ 20 декабря 2018

Как насчет этого?

ts, err := time.Parse("2006-01-02T15:04:05.000+0000", currentTime)

, так как время. RFC3339 просто 2006-01-02T15:04:05Z07:00

...