2011-01-04 8 views
0

Ich habe Probleme mit der Berechnung bestimmter Tage relativ zum aktuellen Datum mit NSDate und NSDateComponents. Nehmen wir zum Beispiel an, ich will letzten Freitag. Ich habe versucht, die folgenden:Computing 'letzten Freitag' mit NSDate + NSDateComponents

NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit) fromDate:[NSDate date]]; 

[components setHour:0]; 
[components setMinute:0]; 
[components setSecond:0]; 
[components setWeekday:6]; //Friday 
[components setWeek:[components week] - 1]; //Last Week 

return [[NSCalendar currentCalendar] dateFromComponents:components]; 

Aber das gibt nur das aktuelle Datum, als ob es nicht herausfinden können, was ich um.

Das fühlt sich an wie es sollte einfach genug sein, aber ich bekomme es einfach nicht funktioniert. Irgendwelche Zeiger?

Antwort

0

Wie wäre es etwa so:

NSDate* today = [NSDate date]; 
NSDateComponents* comps = [[NSCalendar currentCalendar] components:NSWeekdayCalendarUnit fromDate:today]; 

// do the modulo arithmetic to determine the delta days to last Friday 
NSInteger weekday = [comps weekday]; 
NSInteger deltaDays = 0; // left as exercise, I am hungry for lunch... 

NSDateComponents* delta = [[NSDateComponents alloc] init]; 
[delta setDay:deltaDays]; 
NSDate* lastFriday = [[NSCalendar currentCalendar] dateByAddingComponents:delta toDate:today options:0]; 

[delta release]; 
+0

Ich landete etwas ähnliches: – Hunter

+0

NSDate * heute = [NSDate date]; \t NSCalendar * Kalender = CURRENT_CALENDAR; \t \t NSDateComponents * weekdayComponents = [Kalenderkomponenten: NSWeekdayCalendarUnit fromDate: today]; \t NSDateComponents * KomponentenToSubtract = [[NSDateComponents alloc] init]; \t [KomponentenToSubtract setDay: 0 - ([WochentagKomponenten Wochentag] - 6)]; \t \t NSDate * fridayDate = [Kalender dateByAddingComponents: KomponentenToSubtract toDate: today Optionen: 0]; \t Rückgabe [fridayDate addTimeInterval: weekAgoInSeconds]; // eine Woche vorher – Hunter

0

Mit diesem Code:

- (NSDate *)lastDayOfMonthWithDate:(NSDate *)date 
{ 
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit fromDate:date]; 
    components.month += 1; 
    components.day = 0; 

    NSDate *lastDayOfMonth = [[NSCalendar currentCalendar] dateFromComponents:components]; 

    return lastDayOfMonth; 
} 

- (NSDate *)lastFridayOfMonthWithDate:(NSDate *)date 
{ 
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit fromDate:[self lastDayOfMonthWithDate:date]]; 

    if (components.weekday >= 6) { 
     components.day -= components.weekday - 6; 
    } else { 
     components.day += 6 - components.weekday - 7; 
    } 

    NSDate *lastFridayOfMonth = [[NSCalendar currentCalendar] dateFromComponents:components]; 

    return lastFridayOfMonth; 
} 
0

ich diese Funktion schrieb:

- (NSInteger)lastOccurrenceOfWeekdayWithNumber:(NSInteger)weekdayNumber inMonthForDate:(NSDate *)date { 
NSCalendarUnit units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday | NSCalendarUnitWeekdayOrdinal; 
NSRange range = [_calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date]; 
NSDateComponents *dateComponents = [_calendar components:units fromDate:date]; 
dateComponents.day = range.length; 

date = [_calendar dateFromComponents:dateComponents]; 
dateComponents = [_calendar components:units fromDate:date]; 

while (dateComponents.weekday != weekdayNumber) { 
    dateComponents.day -= 1; 
    date = [_calendar dateFromComponents:dateComponents]; 
    dateComponents = [_calendar components:units fromDate:date]; 
} 

return dateComponents.weekdayOrdinal; 
} 

weekdayNumber 1 ist, wenn Sie für den Sonntag suchen. 2 für Montag.

Wenn Sie am letzten Freitag im Oktober finden möchten, können Sie diese verwenden:

[self lastOccurrenceOfWeekdayWithNumber:6 inMonthForDate:date]; 

wo Datum des 11. Oktober sagen lassen, 2016 oder einen anderen Tag des Monats Oktober.

Verwandte Themen