1
0
Fork 0
mirror of https://github.com/Luzifer/mondash.git synced 2024-11-10 08:30:02 +00:00
mondash/vendor/github.com/flosch/go-humanize/times.go

88 lines
1.7 KiB
Go
Raw Normal View History

2016-01-23 12:07:07 +00:00
package humanize
import (
"fmt"
"time"
)
// Seconds-based time units
const (
Minute = 60
Hour = 60 * Minute
Day = 24 * Hour
Week = 7 * Day
Month = 30 * Day
Year = 12 * Month
LongTime = 37 * Year
)
// Time formats a time into a relative string.
//
// Time(someT) -> "3 weeks ago"
func Time(then time.Time) string {
diff := then.Sub(time.Now())
return TimeDuration(diff)
}
func TimeDuration(diff time.Duration) string {
diff /= time.Second
lbl := "ago"
after := diff > 0
if after {
lbl = "from now"
diff += 1
} else {
diff *= -1
}
switch {
case diff <= 0:
return "now"
case diff <= 2:
return fmt.Sprintf("1 second %s", lbl)
case diff < 1*Minute:
return fmt.Sprintf("%d seconds %s", diff, lbl)
case diff < 2*Minute:
return fmt.Sprintf("1 minute %s", lbl)
case diff < 1*Hour:
return fmt.Sprintf("%d minutes %s", diff/Minute, lbl)
case diff < 2*Hour:
return fmt.Sprintf("1 hour %s", lbl)
case diff < 1*Day:
return fmt.Sprintf("%d hours %s", diff/Hour, lbl)
case diff < 2*Day:
return fmt.Sprintf("1 day %s", lbl)
case diff < 1*Week:
return fmt.Sprintf("%d days %s", diff/Day, lbl)
case diff < 2*Week:
return fmt.Sprintf("1 week %s", lbl)
case diff < 1*Month:
return fmt.Sprintf("%d weeks %s", diff/Week, lbl)
case diff < 2*Month:
return fmt.Sprintf("1 month %s", lbl)
case diff < 1*Year:
return fmt.Sprintf("%d months %s", diff/Month, lbl)
case diff < 18*Month:
return fmt.Sprintf("1 year %s", lbl)
case diff < 2*Year:
return fmt.Sprintf("2 years %s", lbl)
case diff < LongTime:
return fmt.Sprintf("%d years %s", diff/Year, lbl)
}
if after {
return "a while from now"
}
return "long ago"
}