Reputation: 287
Hi so I can't seem to find anything to help me on this.
I am using the format string "January 02, 2006" and the time string "2016-07-08"
However when I run a format using these parameters the response I get is July 7th, 2016. The correct response would be July 8th, 2016.
As a note, I am also trying to use this via Sprig.
{{ date "January 02, 2006" .MyDate }}
If I can get any assistance it would be much appreciated
Upvotes: 7
Views: 21692
Reputation: 1167
It's because of the time zone, you're getting the right date, but sprig
formats to "Local" by default, where golang.org/pkg/time
defaults to "UTC"
Here is a sample code: (omitting error handling for simplicity)
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())
}
Output:
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
Here is some reference:
time: https://golang.org/pkg/time
In the absence of a time zone indicator, Parse returns a time in UTC.
spig: https://github.com/Masterminds/sprig/blob/master/functions.go#L407
func date(fmt string, date interface{}) string {
return dateInZone(fmt, date, "Local")
}
Note: if you want to format to a specific time zone, look at the 2nd template:
utcTpl := `sprig: {{ dateInZone "January 02, 2006 (MST)" .MyDate "UTC"}} -- specify UTC time zone`
Upvotes: 12
Reputation: 21957
I think the correct way is to send time.Time
type to your template and then use Format
function on it. You can use ParseTime
to parse your 2016-07-08
format.
type Data struct {
CreatedOn time.Time
}
template.Execute(w, Data{})
Template:
<span>{{ .CreatedOn.Format "January 02, 2006" }}</span>
Upvotes: 2