2012-11-05 1 views
7

Ich versuche, zwei Tage NSDate Objekte zu vergleichen, habe ich zum ersten Mal NSDateComponents verwendet, um den Unterschied zwischen meinen beiden Daten Objekte zu berechnen, aber es funktioniert ordnungsgemäß.Anzahl der Tage zwischen zwei NSDate-Objekten

NSString *dateStr [email protected]"2012-11-05 15:00:00"; 
    NSDate *date = [dateFormat dateFromString:dateStr]; 
    NSDateComponents *datesDiff = [calendar components: NSDayCalendarUnit 
               fromDate: date 
               toDate: [NSDate date] 
               options: 0]; 

Das löst mein Problem nicht. In der Tat, wenn date1 = 2012-11-05 23:00:00 und date2 = 2012-11-06 10:00:00, ist der Unterschied zwischen den Schleppdaten 0 Tag und 11 Stunden. Ich bin auf der Suche nach etwas, mit dem ich Tag Änderungen erkennen kann, mit anderen Worten, wenn date1 = 2012-11-05 23:00:00 und date2 = 2012-11-06 00:01:00, gibt es einen Tag diffrence.

Wenn jemand die Lösung dafür kennt, würde ich seinen Vorschlag begrüßen. Vielen Dank im Voraus

Antwort

19

Ich glaube, Sie sind für diese suchen (aus dem Date and Time Programming Guide):

Listing 13 Tage zwischen zwei Daten, wie die Anzahl der midnights zwischen

@implementation NSCalendar (MySpecialCalculations) 

-(NSInteger)daysWithinEraFromDate:(NSDate *) startDate toDate:(NSDate *) endDate 
{ 
    NSInteger startDay=[self ordinalityOfUnit:NSDayCalendarUnit 
      inUnit: NSEraCalendarUnit forDate:startDate]; 
    NSInteger endDay=[self ordinalityOfUnit:NSDayCalendarUnit 
      inUnit: NSEraCalendarUnit forDate:endDate]; 
    return endDay-startDay; 
} 
@end 

EDIT: Schnelle Version:

extension NSCalendar { 
    func daysWithinEraFromDate(startDate: NSDate, endDate: NSDate) -> Int { 
     let startDay = self.ordinalityOfUnit(.Day, inUnit: NSCalendarUnit.Era, forDate: startDate) 
     let endDay = self.ordinalityOfUnit(.Day, inUnit: NSCalendarUnit.Era, forDate: endDate) 
     return endDay - startDay 
    } 
} 
+0

Das ist genau das, was ich wollte, müssen wir schaffen eine Kategorie zu NSCale ndar wie gesagt auf dem doc. Vielen Dank – Ali

6
NSString *start = @"2010-09-01"; 
NSString *end = @"2010-12-01"; 

NSDateFormatter *f = [[NSDateFormatter alloc] init]; 
[f setDateFormat:@"yyyy-MM-dd"]; 
NSDate *startDate = [f dateFromString:start]; 
NSDate *endDate = [f dateFromString:end]; 
[f release]; 

NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components = [gregorianCalendar components:NSDayCalendarUnit 
                fromDate:startDate 
                 toDate:endDate 
                options:0]; 
[gregorianCalendar release]; 

Komponenten hält jetzt den Unterschied.

NSLog(@"%ld", [components day]); 
0
func daysBetweenDates(startDate: NSDate, endDate: NSDate) -> Int 
{ 
    let calendar = NSCalendar.currentCalendar() 

    let components = calendar.components([.Day], fromDate: startDate, toDate: endDate, options: []) 

    return components.day 
} 

oder

let calendar = NSCalendar.currentCalendar(); 
let component1 = calendar.component(.Day, fromDate: fromDate) 
let component2 = calendar.component(.Day, fromDate: toDate) 
let difference = component1 - component2 
0

Für Swift 3:

Ausbau von Antwort des @ masa:

extension Calendar { 
    func daysWithinEraFromDate(startDate: Date, endDate: Date) -> Int? { 
     guard let startDay = ordinality(of: .day, in: .era, for: startDate) else { 
      return nil 
     } 

     guard let endDay = ordinality(of: .day, in: .era, for: endDate) else { 
      return nil 
     } 

     return endDay - startDay 
    } 
}