| // Package units provides helper function to parse and print size and time units |
| // in human-readable format. |
| package units |
| |
| import ( |
| "fmt" |
| "time" |
| ) |
| |
| // HumanDuration returns a human-readable approximation of a duration |
| // (eg. "About a minute", "4 hours ago", etc.). |
| func HumanDuration(d time.Duration) string { |
| if seconds := int(d.Seconds()); seconds < 1 { |
| return "Less than a second" |
| } else if seconds == 1 { |
| return "1 second" |
| } else if seconds < 60 { |
| return fmt.Sprintf("%d seconds", seconds) |
| } else if minutes := int(d.Minutes()); minutes == 1 { |
| return "About a minute" |
| } else if minutes < 46 { |
| return fmt.Sprintf("%d minutes", minutes) |
| } else if hours := int(d.Hours() + 0.5); hours == 1 { |
| return "About an hour" |
| } else if hours < 48 { |
| return fmt.Sprintf("%d hours", hours) |
| } else if hours < 24*7*2 { |
| return fmt.Sprintf("%d days", hours/24) |
| } else if hours < 24*30*2 { |
| return fmt.Sprintf("%d weeks", hours/24/7) |
| } else if hours < 24*365*2 { |
| return fmt.Sprintf("%d months", hours/24/30) |
| } |
| return fmt.Sprintf("%d years", int(d.Hours())/24/365) |
| } |