time.parse: почему golang неправильно разбирает время?

Я пытаюсь разобрать строку как время, но, к сожалению, идет неверный месяц (январь вместо июня)

package main

import "fmt"
import "time"

func main() {

    t := "2014-06-23T20:29:39.688+01:00"
    tc, _ := time.Parse("2006-01-02T15:04:05.000+01:00", t)

    fmt.Printf("t was %v and tc was %v", t, tc)

}

Играть

2 ответа

Решение

Проблема в том, что смещение часового пояса в макете плохо определено: эталонное смещение -0700, Вы определили как +01:00, Итак 01 интерпретируется как месяц и стирает ранее определенный. И как ваше рабочее смещение 01 а также он анализируется как январь.

Следующий пример работает для меня площадка

package main

import "fmt"
import "time"

func main() {

    t := "2014-06-23T20:29:39.688+01:00"
    tc, _ := time.Parse("2006-01-02T15:04:05.000-07:00", t)

    fmt.Printf("t was %v and tc was %v", t, tc)

}

Ваша строка макета неверна. Числа в строке макета имеют особые значения, и вы используете 1 дважды: один раз в месячной части и один раз в части часового пояса. Часовой пояс в строке, которую вы анализируете 01:00так что вы храните 1 в месяц. Это объясняет, почему возвращаемый месяц был январь (первый месяц).

Исправленная строка макета 2006-01-02T15:04:05.000-07:00, Или, если вы довольны использованием Z представлять UTC, time.RFC3339 константа может быть уместной.

Другие вопросы по тегам