package durations import ( "fmt" "math" "strings" "time" ) func Humanize(d time.Duration) string { days := int64(d.Hours() / 24) hours := int64(math.Mod(d.Hours(), 24)) minutes := int64(math.Mod(d.Minutes(), 60)) seconds := int64(math.Mod(d.Seconds(), 60)) chunks := []struct { singularName string amount int64 }{ {"day", days}, {"hour", hours}, {"minute", minutes}, {"second", seconds}, } var parts []string for _, chunk := range chunks { switch chunk.amount { case 0: continue case 1: parts = append(parts, fmt.Sprintf("%d %s", chunk.amount, chunk.singularName)) default: parts = append(parts, fmt.Sprintf("%d %ss", chunk.amount, chunk.singularName)) } } return strings.Join(parts, " ") }