2016-10-22 8 views
0

Привет, поэтому я не могу найти ничего, чтобы помочь мне в этом.Golang - Дата составления таблицы YYYY-MM-DD

Я использую формат строки «Январь 02, 2006» и временную строку «2016-07-08»

Однако, когда я бегу формат с использованием этих параметров ответа я получаю 7 июля , 2016. Правильный ответ будет 8 июля 2016 года.

В качестве примечания, я также пытаюсь использовать это через Sprig.

{{ date "January 02, 2006" .MyDate }} 

Если я могу получить любую помощь, которую она будет высоко ценится

+0

Это может быть проблемой с преобразованием часового пояса в UTC –

ответ

1

Это из-за часового пояса, вы получаете правильную дату, но sprig форматы "Local" по умолчанию, где golang.org/pkg/time по умолчанию «UTC "

Образец кода: (исключая обработку ошибок для простоты)

func main() { 
    // using the "time" package 
    mydate, _ := time.Parse("2006-01-02", "2016-07-08") 
    fmt.Println("time:", mydate.In(time.Local).Format("January 02, 2006 (MST)"), "-- specify Local time zone") 
    fmt.Println("time:", mydate.Format("January 02, 2006 (MST)"), "-- defaults to UTC") 

    d := struct{ MyDate time.Time }{mydate} 

    //using sprig 
    fmap := sprig.TxtFuncMap() 
    localTpl := `sprig: {{ date "January 02, 2006 (MST)" .MyDate }} -- defaults to Local` 
    t := template.Must(template.New("test").Funcs(fmap).Parse(localTpl)) 
    var localdate bytes.Buffer 
    t.Execute(&localdate, d) 
    fmt.Println(localdate.String()) 

    utcTpl := `sprig: {{ dateInZone "January 02, 2006 (MST)" .MyDate "UTC"}} -- specify UTC time zone` 
    t = template.Must(template.New("test").Funcs(fmap).Parse(utcTpl)) 
    var utcdate bytes.Buffer 
    t.Execute(&utcdate, d) 
    fmt.Println(utcdate.String()) 

} 

Выход:

time: July 07, 2016 (EDT) -- specify Local time zone                     
time: July 08, 2016 (UTC) -- defaults to UTC                       
sprig: July 07, 2016 (EDT) -- defaults to Local                       
sprig: July 08, 2016 (UTC) -- specify UTC time zone 

Вот некоторые ссылки:

Время: https://golang.org/pkg/time

При отсутствии индикатора часового пояса, Анализировать возвращает время в UTC.

SPIG: https://github.com/Masterminds/sprig/blob/master/functions.go#L407

func date(fmt string, date interface{}) string { 
    return dateInZone(fmt, date, "Local") 
} 

Примечание: если вы хотите форматировать к конкретной временной зоне, посмотрите на 2-шаблона:

utcTpl := `sprig: {{ dateInZone "January 02, 2006 (MST)" .MyDate "UTC"}} -- specify UTC time zone` 
+0

Большое спасибо. Это было глубоко и полезно. Из-за этого вырезали мою проблему. Результирующий код: {{dateInZone "02 января 2006 г. (MST)". Дата "UTC"}} Спасибо - я понятия не имею, как отметить свой вопрос, как думал ответ: S. – user1977351

+0

Удивительный, рад, что я мог бы помочь. Удачи :) .. Я вижу, вы уже отметили это. Спасибо. – davidcv5

1

Я думаю, что правильный путь для отправки time.Time типа в шаблон, а затем использовать функцию Format на нем. Вы можете использовать ParseTime для анализа вашего 2016-07-08.

type Data struct { 
    CreatedOn time.Time 
} 

template.Execute(w, Data{}) 

Шаблон:

<span>{{ .CreatedOn.Format "January 02, 2006" }}</span> 
Смежные вопросы