Number of days between two NSDates [duplicate] Number of days between two NSDates [duplicate] ios ios

Number of days between two NSDates [duplicate]


Here's an implementation I used to determine the number of calendar days between two dates:

+ (NSInteger)daysBetweenDate:(NSDate*)fromDateTime andDate:(NSDate*)toDateTime{    NSDate *fromDate;    NSDate *toDate;    NSCalendar *calendar = [NSCalendar currentCalendar];    [calendar rangeOfUnit:NSCalendarUnitDay startDate:&fromDate        interval:NULL forDate:fromDateTime];    [calendar rangeOfUnit:NSCalendarUnitDay startDate:&toDate        interval:NULL forDate:toDateTime];    NSDateComponents *difference = [calendar components:NSCalendarUnitDay        fromDate:fromDate toDate:toDate options:0];    return [difference day];}

EDIT:

Fantastic solution above, here's Swift version below as an extension on NSDate:

extension NSDate {  func numberOfDaysUntilDateTime(toDateTime: NSDate, inTimeZone timeZone: NSTimeZone? = nil) -> Int {    let calendar = NSCalendar.currentCalendar()    if let timeZone = timeZone {      calendar.timeZone = timeZone    }    var fromDate: NSDate?, toDate: NSDate?    calendar.rangeOfUnit(.Day, startDate: &fromDate, interval: nil, forDate: self)    calendar.rangeOfUnit(.Day, startDate: &toDate, interval: nil, forDate: toDateTime)    let difference = calendar.components(.Day, fromDate: fromDate!, toDate: toDate!, options: [])    return difference.day  }}

A bit of force unwrapping going on which you may want to remove depending on your use case.

The above solution also works for time zones other than the current time zone, perfect for an app that shows information about places all around the world.


Here's the best solution I've found. Seems to utilize the Apple approved method for determining any amount of units between NSDates.

- (NSInteger)daysBetween:(NSDate *)dt1 and:(NSDate *)dt2{    NSUInteger unitFlags = NSCalendarUnitDay;    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];    NSDateComponents *components = [calendar components:unitFlags fromDate:dt1 toDate:dt2 options:0];    return [components day] + 1;}

E.g. if you want months as well, then you could include 'NSMonthCalendarUnit' as a unitFlag.

To credit the original blogger, I found this info here (although there was a slight mistake that I've fixed above):http://cocoamatic.blogspot.com/2010/09/nsdate-number-of-days-between-two-dates.html?showComment=1306198273659#c6501446329564880344


Swift 3.0 Update

extension Date {    func differenceInDaysWithDate(date: Date) -> Int {        let calendar = Calendar.current        let date1 = calendar.startOfDay(for: self)        let date2 = calendar.startOfDay(for: date)        let components = calendar.dateComponents([.day], from: date1, to: date2)        return components.day ?? 0    }}

Swift 2.0 Update

extension NSDate {    func differenceInDaysWithDate(date: NSDate) -> Int {        let calendar: NSCalendar = NSCalendar.currentCalendar()        let date1 = calendar.startOfDayForDate(self)        let date2 = calendar.startOfDayForDate(date)        let components = calendar.components(.Day, fromDate: date1, toDate: date2, options: [])        return components.day    }}

Original Solution

Another solution in Swift.

If your purpose is to get the exact day number between two dates, you can work around this issue like this:

// Assuming that firstDate and secondDate are defined// ...var calendar: NSCalendar = NSCalendar.currentCalendar()// Replace the hour (time) of both dates with 00:00let date1 = calendar.startOfDayForDate(firstDate)let date2 = calendar.startOfDayForDate(secondDate)let flags = NSCalendarUnit.DayCalendarUnitlet components = calendar.components(flags, fromDate: date1, toDate: date2, options: nil)components.day  // This will return the number of day(s) between dates