2010-01-03 6 views
9

Grundsätzlich möchte ich herausfinden, ob es am nächsten Tag ist. Also speichere ich das aktuelle Datum (z. B. Jan 2) ständig in einem Plist. Aber das nächste Mal, wenn der Benutzer die Anwendung öffnet, wenn das Datum geändert hat (z. B. Jan 3), möchte ich etwas tun. Beachten Sie, dass eine einfache aufsteigende Reihenfolgeprüfung nicht funktionieren würde, da ich nicht wissen möchte, ob ein Datum später als ein anderes Datum ist, wenn der Unterschied nur in Stunden besteht. Ich muss in der Lage sein, Jan 2 11:50 und Jan 3 2:34 zu unterscheiden, aber nicht Jan 3 2:34 und Jan 3 5:12.Wie zwei Daten (nur Daten, nicht Zeit) in Kakao zu vergleichen?

Antwort

24

verwende ich die folgende, die ich SO gefunden:

- (BOOL)isSameDay:(NSDate*)date1 otherDay:(NSDate*)date2 { 
    NSCalendar* calendar = [NSCalendar currentCalendar]; 

    unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; 
    NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date1]; 
    NSDateComponents* comp2 = [calendar components:unitFlags fromDate:date2]; 

    return [comp1 day] == [comp2 day] && 
    [comp1 month] == [comp2 month] && 
    [comp1 year] == [comp2 year]; 
} 
+0

ursprüngliche Antwort enthält veraltete Code, Austausch: unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; zu diesem: unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; – Borbea

+0

Die Post wurde aktualisiert. Vielen Dank! –

-2

Verwenden NSCalendarDate statt NSDate und vergleichen, was sie kehren von -dayOfCommonEra

@implementation NSDate (sameDayOrNot) 

- (BOOL) sameDayAsDate:(NSDate *) otherDate 
{ 
NSCalendarDate *date1 = [[NSCalendarDate alloc] initWithTimeInterval:0 sinceDate:self]; 
NSCalendarDate *date2 = [[NSCalendarDate alloc] initWithTimeInterval:0 sinceDate:otherDate]; 
BOOL result = ([date1 dayOfCommonEra] == [date2 dayOfCommonEra]); 
[date1 release]; 
[date2 release]; 
return result; 
} 

@end 
+0

NSCalendarDate ist veraltet – Abizern

+0

Noch nicht, es ist nicht. – NSResponder

+1

Äh, ja es ist http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/DatesAndTimes/Articles/LegacyNSCalendarDate.html Veraltet ist nicht das Gleiche wie entfernt. Außerdem geht es nicht darum, die Äquivalenz zweier Daten zu überprüfen, sondern zu erfahren, ob sie sich an verschiedenen Tagen befinden. – Abizern

0

am Date Time Programming Guide Blick gibt Ihnen ein Beispiel, wie um die Differenz zwischen zwei Daten als nach Komponente zu berechnen: zum Beispiel:

NSDate *startDate = ...; 
NSDate *endDate = ...; 

NSCalendar *gregorian = [[NSCalendar alloc] 
    initWithCalendarIdentifier:NSGregorianCalendar]; 

NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit; 

NSDateComponents *components = [gregorian components:unitFlags 
    fromDate:startDate 
    toDate:endDate options:0]; 
NSInteger months = [components month]; 
NSInteger days = [components day]; 
-1

Meine Version basierend auf Neils (Warnung: ungetestet):

Mine ist - (NSComparisonResult)compare: auf NSDate ähnlicher. Um zu überprüfen, für Tage gleich sind, tun [myDate compareDayMonthAndYear:otherDate] == NSOrderedSame

- (NSComparisonResult)compareDayMonthAndYear:(NSDate *)date 
{ 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 

    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 
    NSDateComponents *selfComponents = [calendar components:unitFlags fromDate:self]; 
    NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date]; 

    BOOL dayIsEqual = (selfComponents.day == dateComponents.day && selfComponents.month == dateComponents.month && selfComponents.year == dateComponents.year); 
    if (dayIsEqual) { 
     return NSOrderedSame; 
    } 
    return [self compare:date]; 
} 
Verwandte Themen