Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Golang - Date Parsing a YYYY-MM-DD date

Tags:

date

go

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

like image 564
user1977351 Avatar asked Dec 19 '22 12:12

user1977351


1 Answers

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`
like image 157
davidcv5 Avatar answered Jan 15 '23 04:01

davidcv5