2012-04-13 1 views

Antwort

5

Verwenden NSDateComponents, etwas in der Art:

NSCalendar *gregorian = [[NSCalendar alloc] 
    initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDate *today = [NSDate date]; 

    NSDateComponents *todaysComponents = 
     [gregorian components:NSWeekCalendarUnit fromDate:date]; 

    NSUInteger todaysWeek = [todaysComponents week]; 


    NSDate *anotherDate = [NSDate date]; 

    NSDateComponents *otherComponents = 
     [gregorian components:NSWeekCalendarUnit fromDate:anotherDate]; 

    NSUInteger anotherWeek = [otherComponents week]; 

    if(todaysWeek==anotherWeek){ 
     NSLog(@"another date is this week"); 
    }else if(todaysWeek+1==anotherWeek){ 
     NSLog(@"another date is next week") 
    } 

Sie können auch andere Komponenten wie Monat oder Jahr verwenden, um absolut sicher zu sein.

HINWEIS: Keine timeIntervals verwenden. Mit NSDateComponents ignorieren Sie die Stunden, Minuten und Sekunden. Ich denke du willst das.

+0

vielen dank das ist die beste antwort :), wenn ist die letzte woche des jahres, muss ich mit anderen komponenten überprüfen, um sicher zu sein, richtig? – Piero

+0

Denken Sie genau daran, die Komponenten, die Sie verwenden möchten, so hinzuzufügen: NSDateComponents * todaysComponents = [gregorianische Komponenten: (NSWeekCalendarUnit | NSMonthCalendarUnit) fromDate: date]; dann, hol die Komponenten und vergleiche sie. – Edu

+0

Ok danke, denn wenn ein neues Jahr ist, ist die Nummer der neuen Woche 1 richtig? – Piero

0
NSCalendar *cal = [NSCalendar currentCalendar]; 
NSDateComponents *components = [cal components:NSWeekCalendarUnit fromDate:yourDate]; 
NSInteger week = [components week]; // here your have a Integer with the weeknr of yourDate 

components = [cal components:NSWeekCalendarUnit fromDate:[NSDate date]]; 
weekToday = [components week]; // here your have a Integer with the weeknr of today 

Der Rest sollten Sie tun können. Es könnte eine andere Kopfarbeit bekommen, wenn es um die letzte Woche im Jahr geht.

Klar?

+0

danke, jetzt versuche ich, und wenn ist die letzte Woche im Jahr was passiert? – Piero

+0

dann müssen Sie etwas Mathe Zeug tun. Mach es selbst, ..Es ist gut für dein Gehirn. :) –

+0

danke für die Antwort! – Piero

0

HINWEIS: Dies berechnet die Idee der "Woche" mit einem Sonntag-Samstag-Konzept der Woche.

Um den aktuellen Tag der Woche verwenden Sie die folgenden von here zu berechnen:

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

NSDateComponents *weekdayComponents =[gregorian components:NSWeekdayCalendarUnit fromDate:dateOfInterest]; 

NSInteger weekday = [weekdayComponents weekday]; 
// weekday 1 = Sunday for Gregorian calendar 

[gregorian release]; 

Der Rest ziemlich trivial sein sollte. Holen Sie sich das aktuelle Datum und das Datum von Ihrem NSDate. Finden Sie die Start- und Enddaten unter Verwendung des Tages und des Datums (wenn heute Montag ist, dann ist date - 1 day der erste Tag der Woche usw.). Herauszufinden, welche Woche der das Datum liegt

+0

danke für die Antwort! – Piero

2

die 2 Tage, an diese Methode übergeben.

- (BOOL) isSameWeekAsDate: (NSDate *) aDate andDate:(NSDate *) bDate 
{ 
    NSDateComponents *components1 = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit) fromDate:aDate]; 
    NSDateComponents *components2 = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit) fromDate:bDate]; 

    if ([components1 week] != [components2 week]) return NO; 

    //return (abs([self timeIntervalSinceDate:aDate]) < 604800); // ops, forgot to change "self" with parameter "bDate": 
    return (abs([bDate timeIntervalSinceDate:aDate]) < 604800); 
} 

EDIT: nennen es mit 2 Daten aus verschiedenen Jahren:

[components setDay:31]; 
[components setMonth:12]; 
[components setYear:2010]; 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDate *date1 = [gregorian dateFromComponents:components]; 

// second date (SATURDAY -of the same week, other year...) 
[components setDay:1]; 
[components setMonth:1]; 
[components setYear:2011]; 
NSDate *date2 = [gregorian dateFromComponents:components]; 

if ([self isSameWeekAsDate:date1 andDate:date2]) { 
    NSLog(@"Same Week!"); 
}else{ 
    NSLog(@"OTHER WEEK!"); 
} 
+0

danke für die Antwort! – Piero

+0

Dies wird NO zurückgeben, wenn beide Daten in der gleichen Woche sind, aber verschiedene Jahre, denke ich ... – samson

+0

@samson: mmm, bist du sicher? Lass uns eine +1 setzen ... sehe meine Bearbeitung um einen Anruf zu versuchen. – meronix

1

Ich bin Hinzufügen meine Lösung (implementiert als NSDate Kategorie), die nicht Woche nicht verwendet, die in iOS7 ist veraltet, iOS8

- (NSDate *)firstDateOfWeek { 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDate *startOfWeek; 
    [calendar rangeOfUnit:NSCalendarUnitWeekOfYear startDate:&startOfWeek interval:NULL forDate:self]; 
    return startOfWeek; 
} 

- (BOOL)isSameWeekWithDate:(NSDate *)date { 
    if (ABS(self.timeIntervalSince1970 - date.timeIntervalSince1970) > (7 * 24 * 60 * 60)) { 
     return NO; 
    }  
    return ([[self firstDateOfWeek] timeIntervalSince1970] == [[date firstDateOfWeek] timeIntervalSince1970]); 
} 

- (BOOL)isThisWeek { 
    return [self isSameWeekWithDate:[NSDate new]]; 
} 
0

Für iOS 7 und höher, müssen Sie ersetzen NSWeekCalendarUnit mit NSCalendarUnitWeekOfYear

- (NSInteger)thisW:(NSDate *)date 
{ 
    NSCalendar *gregorian = [[NSCalendar alloc] 
          initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDateComponents *todaysComponents = [gregorian components:NSCalendarUnitWeekOfYear fromDate:[NSDate date]]; 
    NSUInteger todaysWeek = [todaysComponents weekOfYear]; 
    NSDateComponents *otherComponents = [gregorian components:NSCalendarUnitWeekOfYear fromDate:date]; 
    NSUInteger datesWeek = [otherComponents weekOfYear]; 

    //NSLog(@"Date %@",date); 
    if(todaysWeek==datesWeek){ 
     //NSLog(@"Date is in this week"); 
     return 1; 
    }else if(todaysWeek+1==datesWeek){ 
     //NSLog(@"Date is in next week"); 
     return 2; 
    } else { 
     return 0; 
    } 

} 
0

Vergessen Sie aktuelle Komponenten, Sie viele Dinge zwicken (überprüfen, ob es die letzte Woche des Jahres ist, prüfen Sie, ob der Sonntag der Anfang der Woche ist ...) und ist anfällig zu Fehlern und Spaghetti Code.

Dies löst das Problem und erweitert wird „letzte Woche“, „vorige Woche“, „diese Woche“, „nächste Woche“ und „Wochen später“

-(EventWeekRange)numberOfWeeksFromTodayToEvent:(NSDate *)eventDate { 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSComparisonResult comparison = [calendar compareDate:[NSDate date] toDate:eventDate toUnitGranularity:NSCalendarUnitWeekOfYear]; 
    if (comparison == NSOrderedSame) { 
     return RangeThisWeek; 
    } else if (comparison == NSOrderedAscending) { // The event date is in the future 
     // Advance today's date one week to check if this new date is in the same week as the event 
     NSDate *todaysNextWeek = [[NSDate date]dateByAddingTimeInterval:60*60*24*7]; 
     if ([calendar compareDate:todaysNextWeek toDate:eventDate toUnitGranularity:NSCalendarUnitWeekOfYear] == NSOrderedSame) { 
      return RangeNextWeek; 
     } else { 
      return RangeLater; 
     } 
    } else { // The event date is in the past 
     // Advance the event's date one week to check if this new date is in the same week as today 
     NSDate *eventsNextWeek = [eventDate dateByAddingTimeInterval:60*60*24*7]; 
     if ([calendar compareDate:eventsNextWeek toDate:[NSDate date] toUnitGranularity:NSCalendarUnitWeekOfYear] == NSOrderedSame) { 
      return RangeLastWeek; 
     } else { 
      return RangeEarlier; 
     } 
    } 
}