Swift convert time to time ago

前端 未结 13 1365
一个人的身影
一个人的身影 2020-12-24 02:14

In Swift5, we have RelativeDateTimeFormatter

Prior to Swift5:


I\'m trying to convert time to time ago, what i wanna do is:

from 1

13条回答
  •  无人及你
    2020-12-24 02:53

    Here is a solution you can copy paste

     func timeAgoSinceDate(_ date:Date, numericDates:Bool = false) -> String? {
        let calendar = NSCalendar.current
        let unitFlags: Set = [.minute, .hour, .day, .weekOfYear, .month, .year, .second]
        let now = Date()
        let earliest = now < date ? now : date
        let latest = (earliest == now) ? date : now
        let components = calendar.dateComponents(unitFlags, from: earliest,  to: latest)
    
        if (components.year! >= 2) {
            return "\(components.year!)yr"
        } else if (components.year! >= 1){
            if (numericDates){
                return "1yr"
            } else {
                return "Last year"
            }
        } else if (components.month! >= 2) {
            return "\(components.month!)mo"
        } else if (components.month! >= 1){
            if (numericDates){
                return "1 mo"
            } else {
                return "Last mo"
            }
        } else if (components.weekOfYear! >= 2) {
            return "\(components.weekOfYear!) weeks"
        } else if (components.weekOfYear! >= 1){
            if (numericDates){
                return "1 week"
            } else {
                return "Last week"
            }
        } else if (components.day! >= 2) {
            return "\(components.day!) d"
        } else if (components.day! >= 1){
            if (numericDates){
                return "1 d"
            } else {
                return "1 d"
            }
        } else if (components.hour! >= 2) {
            return "\(components.hour!) hrs"
        } else if (components.hour! >= 1){
            if (numericDates){
                return "1 hr"
            } else {
                return "1 hr"
            }
        } else if (components.minute! >= 2) {
            return "\(components.minute!) m"
        } else if (components.minute! >= 1){
            if (numericDates){
                return "1 m"
            } else {
                return "2 m"
            }
        } else if (components.second! >= 3) {
            return "\(components.second!)s"
        } else {
            return "now"
        }
    
    }
    

    to call, simply use

        // the date you are getting information about 
    let dateToReference = Date()
                if let timeAgo = timeAgoSinceDate(dateToReference) {
                    //will be a String value
                    print(timeAgo)
    
                } else {
                    //just in case something goes wrong
                    print("recently")
    
                }
    

提交回复
热议问题