package tools import ( "strconv" "time" dp "github.com/markusmobius/go-dateparser" "github.com/markusmobius/go-dateparser/date" ) const DateFormat = "January 02, 2006 at 03:04:05PM -0700" // These are somewhat arbitrary, but reasonably useful min and max times var ( MinTime = time.Unix(-2208988800, 0) // Jan 1, 1900 MaxTime = MinTime.Add(1<<63 - 1) ) func ParseDate(in string) (t time.Time, err error) { if in == "min" { return MinTime, nil } if in == "max" { return MaxTime, nil } var er error for _, format := range []string{time.RFC3339, DateFormat} { if t, er = time.ParseInLocation(format, in, nil); er == nil { return } } var ts int64 if ts, er = strconv.ParseInt(in, 10, 0); er == nil { t = time.Unix(ts, 0) return } conf := dp.Configuration{ CurrentTime: time.Now().Local(), ReturnTimeAsPeriod: true, Languages: []string{"en"}, } d, err := dp.Parse(&conf, in) t = d.Time if err != nil { return } y, mon, day, h, loc := t.Year(), t.Month(), t.Day(), t.Hour(), t.Location() switch d.Period { case date.Second: t = t.Truncate(time.Second) case date.Minute: t = t.Truncate(time.Minute) case date.Hour: t = time.Date(y, mon, day, h, 0, 0, 0, loc) case date.Day: t = time.Date(y, mon, day, 0, 0, 0, 0, loc) case date.Month: t = time.Date(y, mon, 1, 0, 0, 0, 0, loc) case date.Year: t = time.Date(y, 1, 1, 0, 0, 0, 0, loc) } return }