// FromDuration returns a friendly string representing an approximation of the
func FromDuration(d time.Duration) string {
seconds := round(d.Seconds())
return "less than a minute"
minutes := div(seconds, 60)
return fmt.Sprintf("%0d minutes", minutes)
hours := div(minutes, 60)
return fmt.Sprintf("about %s", pluralize(hours, "hour"))
if minutes < (42 * hour) {
if minutes < (30 * day) {
return pluralize(days, "day")
if minutes < (45 * day) {
if minutes < (60 * day) {
return pluralize(months, "month")
return fmt.Sprintf("about %s", pluralize(years, "year"))
return fmt.Sprintf("over %s", pluralize(years, "year"))
return fmt.Sprintf("almost %s", pluralize(years, "year"))
// FromTime returns a friendly string representing the approximate difference
// from the given time and time.Now()
func FromTime(t time.Time) string {
return fmt.Sprintf("%s %s", FromDuration(d), suffix)
func pluralize(i int, s string) string {
buf.WriteString(fmt.Sprintf("%d %s", i, s))
func round(f float64) int {
return int(math.Floor(f + .50))
func div(numerator int, denominator int) int {
rem := numerator % denominator
result := numerator / denominator
if rem >= (denominator / 2) {