35 lines
922 B
Go
35 lines
922 B
Go
package format
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// FriendlyDuration formats a duration in an approximate, human friendly duration.
|
|
// For example 55 hours will result in "2 days".
|
|
func FriendlyDuration(duration time.Duration) string {
|
|
const twoDays = 48 * time.Hour
|
|
switch {
|
|
case duration < time.Minute:
|
|
seconds := int(duration.Round(time.Second).Seconds())
|
|
const two = 2
|
|
if seconds < two {
|
|
return fmt.Sprintf("%d second", seconds)
|
|
}
|
|
return fmt.Sprintf("%d seconds", seconds)
|
|
case duration <= time.Hour:
|
|
minutes := int(duration.Round(time.Minute).Minutes())
|
|
if minutes == 1 {
|
|
return "1 minute"
|
|
}
|
|
return fmt.Sprintf("%d minutes", minutes)
|
|
case duration < twoDays:
|
|
hours := int(duration.Truncate(time.Hour).Hours())
|
|
return fmt.Sprintf("%d hours", hours)
|
|
default:
|
|
const hoursInDay = 24
|
|
days := int(duration.Truncate(time.Hour).Hours() / hoursInDay)
|
|
return fmt.Sprintf("%d days", days)
|
|
}
|
|
}
|