import Foundation
func toRelativePastTime(_ past: Date) -> String {
let now = Date()
let delta = abs(now.timeIntervalSince(past)) // seconds as Double
let seconds = Int(delta)
let minutes = seconds / 60
let hours = seconds / 3600
let days = seconds / 86400
if seconds < 60 {
return seconds == 1 ? "one second ago" : "\(seconds) seconds ago"
}
if seconds < 3600 {
return minutes == 1 ? "a minute ago" : "\(minutes) minutes ago"
}
if seconds < 86400 {
return hours == 1 ? "an hour ago" : "\(hours) hours ago"
}
if seconds < 2_592_000 { // 30 days
return days == 1 ? "yesterday" : "\(days) days ago"
}
if seconds < 31_104_000 { // 12 months
let months = days / 30
return months <= 1 ? "a month ago" : "\(months) months ago"
}
let years = days / 365
return years <= 1 ? "a year ago" : "\(years) years ago"
}
func test(_ hoursAgo: Double) {
let secondsAgo = Int(hoursAgo * 3600)
let past = Date().addingTimeInterval(TimeInterval(-secondsAgo))
print(toRelativePastTime(past))
}
test(0.01) // 36 seconds ago
test(0.2) // 12 minutes ago
test(3) // 3 hours ago
test(25) // yesterday
test(360) // 15 days ago
test(1239) // a month ago
test(2239) // 3 months ago
test(8760) // a year ago
test(98763) // 11 years ago
/*
run:
36 seconds ago
12 minutes ago
3 hours ago
yesterday
15 days ago
a month ago
3 months ago
a year ago
11 years ago
*/