2016-10-22 274 views
0

嗨,所以我似乎无法找到任何东西来帮助我解决这个问题。Golang - 日期解析YYYY-MM-DD日期

我使用的格式字符串 “2006年1月2日” 和时间字符串 “2016年7月8日”

然而,当我运行使用这些参数我得到的回应的格式是7月7日,2016年。正确的回应将是2016年7月8日。

作为一个说明,我也试图通过Sprig来使用它。

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

如果我能得到它,将不胜感激

+0

这可能是一个问题时区转换为UTC –

回答

1

这是因为时区的,你得到正确的日期,但sprig格式“本地”在默认情况下,在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时间。

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

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

注:如果你想格式化一个特定的时间段,看第二个模板:

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

非常感谢。这是深入和有用的。由此解决了我的问题。结果代码: {{dateInZone“2006年1月2日(MST)”.Date“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>