конвертировать метку времени из одного действительного формата RFC3339 в другой в Go - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть строки меток времени в этом формате 2020-01-17T14:41:56.393+0530, и я хочу, чтобы они были преобразованы в этот формат 2019-01-18T04:32:03Z

Метод time.Parse Документация на этом Годо c говорит, что оба являются действительными форматами RFC3339, но как мне преобразовать их из этой формы в форму Z ?.

На самом деле я хочу выяснить, находится ли определенная отметка времени в этом формате 2020-01-17T14:41:56.393+0530 в диапазоне двух отметок времени в формате z 2019-01-18T04:32:03Z

1 Ответ

1 голос
/ 04 февраля 2020

оба являются действительными форматами RFC3339

Пакет времени определяет RFC3339 как:

RFC3339 = "2006-01-02T15:04:05Z07:00"

Так что 2020-01-17T14:41:56.393+0530 недопустимо ( в часовом поясе нет толстой кишки). См. этот выпуск для обсуждения того, соответствует ли Go обработка этого вопроса RF C.

преобразовать их от этой формы до формы Z

Вам не нужно - после преобразования в time.Time пакет позаботится о часовых поясах для вас. Например:

checkTime, err := time.Parse("2006-01-02T15:04:05Z0700", "2020-01-17T14:41:56.393+0530")
if err != nil {
    panic(err)
}
startRange, err := time.Parse(time.RFC3339, "2020-01-18T02:32:03Z")
if err != nil {
    panic(err)
}
endRange, err := time.Parse(time.RFC3339, "2020-01-18T04:32:03Z")
if err != nil {
    panic(err)
}

fmt.Printf("check: %v start: %v end: %v", checkTime, startRange, endRange)
if !startRange.After(checkTime) && !endRange.Before(checkTime) {
    fmt.Println("Check 1 in range")
}

checkTime, err = time.Parse(time.RFC3339, "2020-01-18T09:41:56.393+05:30")
if err != nil {
    panic(err)
}
if !startRange.After(checkTime) && !endRange.Before(checkTime) {
    fmt.Println("Check 2 in range")
}

fmt.Printf("check: %v start: %v end: %v", checkTime.Local(), startRange.Local(), endRange.Local())
...