package humanize import ( "strings" "time" "github.com/goodsign/monday" ) const ( Day = 24 * time.Hour Week = 7 * Day Year = 365 * Day ) type truncator struct { d time.Duration s string } var shortTruncators = []truncator{ {d: Day, s: "15:04"}, {d: Week, s: "Mon 15:04"}, {d: Year, s: "15:04 02/01"}, {d: -1, s: "15:04 02/01/2006"}, } func TimeAgo(t time.Time) string { return timeAgo(t, shortTruncators) } var longTruncators = []truncator{ {d: Day, s: "Today at 15:04"}, {d: Week, s: "Last Monday at 15:04"}, {d: -1, s: "15:04 02/01/2006"}, } func TimeAgoLong(t time.Time) string { return timeAgo(t, longTruncators) } func TimeAgoShort(t time.Time) string { t = t.Local() return monday.Format(t, "15:04", Locale) } func timeAgo(t time.Time, truncs []truncator) string { t = t.Local() ensureLocale() trunc := t now := time.Now().Local() for _, truncator := range truncs { trunc = trunc.Truncate(truncator.d) now = now.Truncate(truncator.d) if trunc.Equal(now) || truncator.d == -1 { return monday.Format(t, truncator.s, Locale) } } return "" } // Error returns a short error string. func Error(err error) string { parts := strings.Split(err.Error(), ":") return strings.TrimSpace(parts[len(parts)-1]) }