Getting the difference between two Dates (months/days/hours/minutes/seconds) in Swift

前端 未结 19 2034
时光说笑
时光说笑 2020-11-22 02:16

I am trying to get the difference between the current date as NSDate() and a date from a PHP time(); call for example: NSDate(timeIntervalSin

相关标签:
19条回答
  • 2020-11-22 02:52

    combined Extension + DateComponentsFormatter from the answer of @leo-dabus

    Xcode 8.3 • Swift 3.1

    extension DateComponentsFormatter {
        func difference(from fromDate: Date, to toDate: Date) -> String? {
            self.allowedUnits = [.year,.month,.weekOfMonth,.day]
            self.maximumUnitCount = 1
            self.unitsStyle = .full
            return self.string(from: fromDate, to: toDate)
        }
    }
    
    let dateComponentsFormatter = DateComponentsFormatter()
    dateComponentsFormatter.difference(from: Date(), to: Date(timeIntervalSinceNow: 4000000)) // "1 month"
    
    0 讨论(0)
  • 2020-11-22 02:53

    This is the shorter version: Basically I try to get the difference between the post timestamp with the Date() now.

    // MARK: - UPDATE Time Stamp
    static func updateTimeStampPost(postTimeStamp: Date?, _ completion: (_ finalString: String?) -> Void) {
        // date in the current state
        let date = Date()
        let dateComponentFormatter = DateComponentsFormatter()
    
        // change the styling date, wether second minute or hour
        dateComponentFormatter.unitsStyle = .abbreviated
        dateComponentFormatter.allowedUnits = [.second, .minute, .hour, .day, .weekOfMonth]
        dateComponentFormatter.maximumUnitCount = 1
    
        // return the date new format as a string in the completion
        completion(dateComponentFormatter.string(from: postTimeStamp!, to: date))
    }
    
    0 讨论(0)
  • 2020-11-22 02:56
       func dateDiff(dateStr:String) -> String {
                var f:NSDateFormatter = NSDateFormatter()
                f.timeZone = NSTimeZone.localTimeZone()
                f.dateFormat = "yyyy-M-dd'T'HH:mm:ss.SSSZZZ"
    
                var now = f.stringFromDate(NSDate())
                var startDate = f.dateFromString(dateStr)
                var endDate = f.dateFromString(now)
                var calendar: NSCalendar = NSCalendar.currentCalendar()
    
                let calendarUnits = NSCalendarUnit.CalendarUnitWeekOfMonth | NSCalendarUnit.CalendarUnitDay | NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute | NSCalendarUnit.CalendarUnitSecond
                let dateComponents = calendar.components(calendarUnits, fromDate: startDate!, toDate: endDate!, options: nil)
    
                let weeks = abs(dateComponents.weekOfMonth)
                let days = abs(dateComponents.day)
                let hours = abs(dateComponents.hour)
                let min = abs(dateComponents.minute)
                let sec = abs(dateComponents.second)
    
                var timeAgo = ""
    
                if (sec > 0){
                    if (sec > 1) {
                        timeAgo = "\(sec) Seconds Ago"
                    } else {
                        timeAgo = "\(sec) Second Ago"
                    }
                }
    
                if (min > 0){
                    if (min > 1) {
                        timeAgo = "\(min) Minutes Ago"
                    } else {
                        timeAgo = "\(min) Minute Ago"
                    }
                }
    
                if(hours > 0){
                    if (hours > 1) {
                        timeAgo = "\(hours) Hours Ago"
                    } else {
                        timeAgo = "\(hours) Hour Ago"
                    }
                }
    
                if (days > 0) {
                    if (days > 1) {
                        timeAgo = "\(days) Days Ago"
                    } else {
                        timeAgo = "\(days) Day Ago"
                    }
                }
    
                if(weeks > 0){
                    if (weeks > 1) {
                        timeAgo = "\(weeks) Weeks Ago"
                    } else {
                        timeAgo = "\(weeks) Week Ago"
                    }
                }
    
                print("timeAgo is===> \(timeAgo)")
                return timeAgo;
            }
    
    0 讨论(0)
  • 2020-11-22 02:57

    Swift 5.1 • iOS 13

    You can use RelativeDateFormatter that has been introduced by Apple in iOS 13.

    let exampleDate = Date().addingTimeInterval(-15000)
    
    let formatter = RelativeDateTimeFormatter()
    formatter.unitsStyle = .full
    let relativeDate = formatter.localizedString(for: exampleDate, relativeTo: Date())
    
    print(relativeDate) // 4 hours ago
    

    See How to show a relative date and time using RelativeDateTimeFormatter.

    0 讨论(0)
  • 2020-11-22 02:57

    I added a "long" version to Leo Dabus's asnwer in case you want to have a string that says something like "2 weeks ago" instead of just "2w"...

    extension Date {
        /// Returns the amount of years from another date
        func years(from date: Date) -> Int {
            return Calendar.current.dateComponents([.year], from: date, to: self).year ?? 0
        }
        /// Returns the amount of months from another date
        func months(from date: Date) -> Int {
            return Calendar.current.dateComponents([.month], from: date, to: self).month ?? 0
        }
        /// Returns the amount of weeks from another date
        func weeks(from date: Date) -> Int {
            return Calendar.current.dateComponents([.weekOfYear], from: date, to: self).weekOfYear ?? 0
        }
        /// Returns the amount of days from another date
        func days(from date: Date) -> Int {
            return Calendar.current.dateComponents([.day], from: date, to: self).day ?? 0
        }
        /// Returns the amount of hours from another date
        func hours(from date: Date) -> Int {
            return Calendar.current.dateComponents([.hour], from: date, to: self).hour ?? 0
        }
        /// Returns the amount of minutes from another date
        func minutes(from date: Date) -> Int {
            return Calendar.current.dateComponents([.minute], from: date, to: self).minute ?? 0
        }
        /// Returns the amount of seconds from another date
        func seconds(from date: Date) -> Int {
            return Calendar.current.dateComponents([.second], from: date, to: self).second ?? 0
        }
        /// Returns the a custom time interval description from another date
        func offset(from date: Date) -> String {
            if years(from: date)   > 0 { return "\(years(from: date))y"   }
            if months(from: date)  > 0 { return "\(months(from: date))M"  }
            if weeks(from: date)   > 0 { return "\(weeks(from: date))w"   }
            if days(from: date)    > 0 { return "\(days(from: date))d"    }
            if hours(from: date)   > 0 { return "\(hours(from: date))h"   }
            if minutes(from: date) > 0 { return "\(minutes(from: date))m" }
            if seconds(from: date) > 0 { return "\(seconds(from: date))s" }
            return ""
        }
    
        func offsetLong(from date: Date) -> String {
            if years(from: date)   > 0 { return years(from: date) > 1 ? "\(years(from: date)) years ago" : "\(years(from: date)) year ago" }
            if months(from: date)  > 0 { return months(from: date) > 1 ? "\(months(from: date)) months ago" : "\(months(from: date)) month ago" }
            if weeks(from: date)   > 0 { return weeks(from: date) > 1 ? "\(weeks(from: date)) weeks ago" : "\(weeks(from: date)) week ago"   }
            if days(from: date)    > 0 { return days(from: date) > 1 ? "\(days(from: date)) days ago" : "\(days(from: date)) day ago" }
            if hours(from: date)   > 0 { return hours(from: date) > 1 ? "\(hours(from: date)) hours ago" : "\(hours(from: date)) hour ago"   }
            if minutes(from: date) > 0 { return minutes(from: date) > 1 ? "\(minutes(from: date)) minutes ago" : "\(minutes(from: date)) minute ago" }
            if seconds(from: date) > 0 { return seconds(from: date) > 1 ? "\(seconds(from: date)) seconds ago" : "\(seconds(from: date)) second ago" }
            return ""
        }
    
    }
    
    0 讨论(0)
  • 2020-11-22 02:59

    In Swift 2.2

        /// Returns the amount of years from another date
    func years(fromdate: NSDate) -> Int {
        return NSCalendar.currentCalendar().components([.Year], fromDate: fromdate, toDate: NSDate(), options: []).year ?? 0
    }
    /// Returns the amount of months from another date
    func months(fromdate: NSDate) -> Int {
        return NSCalendar.currentCalendar().components([.Month], fromDate: fromdate, toDate: NSDate(), options: []).month ?? 0
    }
    /// Returns the amount of weeks from another date
    func weeks(fromdate: NSDate) -> Int {
        return NSCalendar.currentCalendar().components([.WeekOfYear], fromDate: fromdate, toDate: NSDate(), options: []).weekOfYear ?? 0
    }
    /// Returns the amount of days from another date
    func days(fromdate: NSDate) -> Int {
        return NSCalendar.currentCalendar().components([.Day], fromDate: fromdate, toDate: NSDate(), options: []).day ?? 0
    }
    /// Returns the amount of hours from another date
    func hours(fromdate: NSDate) -> Int {
        return NSCalendar.currentCalendar().components([.Hour], fromDate: fromdate, toDate: NSDate(), options: []).hour ?? 0
    }
    /// Returns the amount of minutes from another date
    func minutes(fromdate: NSDate) -> Int {
        return NSCalendar.currentCalendar().components([.Minute], fromDate: fromdate, toDate: NSDate(), options: []).minute ?? 0
    }
    /// Returns the amount of seconds from another date
    func seconds(fromdate: NSDate) -> Int {
        return NSCalendar.currentCalendar().components(.Second, fromDate: fromdate, toDate: NSDate(), options: []).second ?? 0
    }
    
    0 讨论(0)
提交回复
热议问题