How to calculate relative past time from a given date & time (e.g., 3 hours ago, 5 days ago, a month ago) in Swift

1 Answer

0 votes
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

*/

 



answered Apr 13 by avibootz

Related questions

...