package sprig import ( "strconv" "time" ) // Given a format and a date, format the date string. // // Date can be a `time.Time` or an `int, int32, int64`. // In the later case, it is treated as seconds since UNIX // epoch. func date(fmt string, date interface{}) string { return dateInZone(fmt, date, "Local") } func htmlDate(date interface{}) string { return dateInZone("2006-01-02", date, "Local") } func htmlDateInZone(date interface{}, zone string) string { return dateInZone("2006-01-02", date, zone) } func dateInZone(fmt string, date interface{}, zone string) string { var t time.Time switch date := date.(type) { default: t = time.Now() case time.Time: t = date case *time.Time: t = *date case int64: t = time.Unix(date, 0) case int: t = time.Unix(int64(date), 0) case int32: t = time.Unix(int64(date), 0) } loc, err := time.LoadLocation(zone) if err != nil { loc, _ = time.LoadLocation("UTC") } return t.In(loc).Format(fmt) } func dateModify(fmt string, date time.Time) time.Time { d, err := time.ParseDuration(fmt) if err != nil { return date } return date.Add(d) } func dateAgo(date interface{}) string { var t time.Time switch date := date.(type) { default: t = time.Now() case time.Time: t = date case int64: t = time.Unix(date, 0) case int: t = time.Unix(int64(date), 0) } // Drop resolution to seconds duration := time.Since(t).Round(time.Second) return duration.String() } func toDate(fmt, str string) time.Time { t, _ := time.ParseInLocation(fmt, str, time.Local) return t } func unixEpoch(date time.Time) string { return strconv.FormatInt(date.Unix(), 10) }