Swift convert time to time ago Swift convert time to time ago swift swift

Swift convert time to time ago


I'll just update the Truongky's answer for Swif 3:

extension Date {func getElapsedInterval() -> String {    let interval = Calendar.current.dateComponents([.year, .month, .day], from: self, to: Date())    if let year = interval.year, year > 0 {        return year == 1 ? "\(year)" + " " + "year ago" :            "\(year)" + " " + "years ago"    } else if let month = interval.month, month > 0 {        return month == 1 ? "\(month)" + " " + "month ago" :            "\(month)" + " " + "months ago"    } else if let day = interval.day, day > 0 {        return day == 1 ? "\(day)" + " " + "day ago" :            "\(day)" + " " + "days ago"    } else {        return "a moment ago"    }}}

If you prefer a localizable response instead of only english this code will do the work

extension Date {func getElapsedInterval() -> String {    var calendar = Calendar.current    calendar.locale = Locale(identifier: Bundle.main.preferredLocalizations[0]) // IF THE USER HAVE THE PHONE IN SPANISH BUT YOUR APP ONLY SUPPORTS I.E. ENGLISH AND GERMAN// WE SHOULD CHANGE THE LOCALE OF THE FORMATTER TO THE PREFERRED ONE // (IS THE LOCALE THAT THE USER IS SEEING THE APP), IF NOT, THIS ELAPSED TIME // IS GOING TO APPEAR IN SPANISH    let formatter = DateComponentsFormatter()    formatter.unitsStyle = .full    formatter.maximumUnitCount = 1    formatter.calendar = calendar    var dateString: String?    let interval = calendar.dateComponents([.year, .month, .weekOfYear, .day], from: self, to: Date())    if let year = interval.year, year > 0 {        formatter.allowedUnits = [.year] //2 years    } else if let month = interval.month, month > 0 {        formatter.allowedUnits = [.month] //1 month    } else if let week = interval.weekOfYear, week > 0 {        formatter.allowedUnits = [.weekOfMonth] //3 weeks    } else if let day = interval.day, day > 0 {        formatter.allowedUnits = [.day] // 6 days    } else {        let dateFormatter = DateFormatter()        dateFormatter.locale = Locale(identifier: Bundle.main.preferredLocalizations[0]) //--> IF THE USER HAVE THE PHONE IN SPANISH BUT YOUR APP ONLY SUPPORTS I.E. ENGLISH AND GERMAN WE SHOULD CHANGE THE LOCALE OF THE FORMATTER TO THE PREFERRED ONE (IS THE LOCALE THAT THE USER IS SEEING THE APP), IF NOT, THIS ELAPSED TIME IS GOING TO APPEAR IN SPANISH        dateFormatter.dateStyle = .medium        dateFormatter.doesRelativeDateFormatting = true        dateString = dateFormatter.string(from: self) // IS GOING TO SHOW 'TODAY'    }    if dateString == nil {        dateString = formatter.string(from: self, to: Date())    }    return dateString!}


Swift 4+ Version

extension Date {    func timeAgoSinceDate() -> String {        // From Time        let fromDate = self        // To Time        let toDate = Date()        // Estimation        // Year        if let interval = Calendar.current.dateComponents([.year], from: fromDate, to: toDate).year, interval > 0  {            return interval == 1 ? "\(interval)" + " " + "year ago" : "\(interval)" + " " + "years ago"        }        // Month        if let interval = Calendar.current.dateComponents([.month], from: fromDate, to: toDate).month, interval > 0  {            return interval == 1 ? "\(interval)" + " " + "month ago" : "\(interval)" + " " + "months ago"        }        // Day        if let interval = Calendar.current.dateComponents([.day], from: fromDate, to: toDate).day, interval > 0  {            return interval == 1 ? "\(interval)" + " " + "day ago" : "\(interval)" + " " + "days ago"        }        // Hours        if let interval = Calendar.current.dateComponents([.hour], from: fromDate, to: toDate).hour, interval > 0 {            return interval == 1 ? "\(interval)" + " " + "hour ago" : "\(interval)" + " " + "hours ago"        }        // Minute        if let interval = Calendar.current.dateComponents([.minute], from: fromDate, to: toDate).minute, interval > 0 {            return interval == 1 ? "\(interval)" + " " + "minute ago" : "\(interval)" + " " + "minutes ago"        }        return "a moment ago"    }}

Usage

yourDate.timeAgoSinceDate()


Change your text as you want.

extension NSDate {    func getElapsedInterval() -> String {        var interval = NSCalendar.currentCalendar().components(.Year, fromDate: self, toDate: NSDate(), options: []).year        if interval > 0 {            return interval == 1 ? "\(interval)" + " " + "year" :            "\(interval)" + " " + "years"        }        interval = NSCalendar.currentCalendar().components(.Month, fromDate: self, toDate: NSDate(), options: []).month        if interval > 0 {            return interval == 1 ? "\(interval)" + " " + "month" :            "\(interval)" + " " + "months"        }        interval = NSCalendar.currentCalendar().components(.Day, fromDate: self, toDate: NSDate(), options: []).day        if interval > 0 {            return interval == 1 ? "\(interval)" + " " + "day" :            "\(interval)" + " " + "days"        }        interval = NSCalendar.currentCalendar().components(.Hour, fromDate: self, toDate: NSDate(), options: []).hour        if interval > 0 {            return interval == 1 ? "\(interval)" + " " + "hour" :            "\(interval)" + " " + "hours"        }        interval = NSCalendar.currentCalendar().components(.Minute, fromDate: self, toDate: NSDate(), options: []).minute        if interval > 0 {            return interval == 1 ? "\(interval)" + " " + "minute" :            "\(interval)" + " " + "minutes"        }        return "a moment ago"    }}