формат времени преобразован в формат strftime по умолчанию

В статье Википедии для Common Log Format формат strftime указан как:

[10/Oct/2000:13:55:36 -0700] — дата, время и часовой пояс получения запроса, по умолчанию в формате strftime %d/%b/%Y:%H:%M: %S %z.

Когда я пытаюсь использовать функцию time.Format:

package main

import (
    "fmt"
    "time"
)

func main() {
    t, _ := time.Parse(time.UnixDate, "Tue Oct 10 13:55:36 PDT 2000")
    fmt.Println(time.Time(t).Format("01/Feb/2006:15:04:05 -0700"))
}

Я получаю вывод [10/Feb/2000:13:55:36 +0000], хотя ожидал [10/Oct/2000:13:55:36 -0700] (согласно Википедии). Что не так с моим форматированием?

Я проверил, что этот день был вторник, а часовой пояс для этой даты был -7 часов (PDT).


person Laurent    schedule 26.03.2018    source источник
comment
Возможный дубликат Почему Go не анализирует time.Parse() идентификатор часового пояса?   -  person Oleg Sklyar    schedule 27.03.2018
comment
И обсуждение здесь stackoverflow.com/questions/49084928/   -  person Oleg Sklyar    schedule 27.03.2018
comment
Я думаю, вы правы насчет дубликата для часового пояса, но как насчет месяца? Обратите внимание, что месяц привязан к отформатированной строке месяца.   -  person Laurent    schedule 27.03.2018
comment
Как указано ниже, используйте январь вместо февраля, но часовой пояс все еще остается проблемой.   -  person Oleg Sklyar    schedule 27.03.2018


Ответы (1)


Для макета Format Jan не Feb. Например,

package main

import (
    "fmt"
    "time"
)

func main() {
    t, err := time.Parse(time.UnixDate, "Tue Oct 10 13:55:36 PDT 2000")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(time.Time(t).Format("01/Jan/2006:15:04:05 -0700"))
}

Вывод:

10/Oct/2000:13:55:36 +0000

Кроме того, для часового пояса используйте ParseInLocation,

package main

import (
    "fmt"
    "time"
)

func main() {
    loc, err := time.LoadLocation("America/Los_Angeles")
    if err != nil {
        fmt.Println(err)
        return
    }
    t, err := time.ParseInLocation(time.UnixDate, "Tue Oct 10 13:55:36 PDT 2000", loc)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(t)
    fmt.Println(time.Time(t).Format("01/Jan/2006:15:04:05 -0700"))
}

Игровая площадка: https://play.golang.org/p/tBLw5oJSE5t

Вывод:

2000-10-10 13:55:36 -0700 PDT
10/Oct/2000:13:55:36 -0700
person peterSO    schedule 26.03.2018