iPhone NSDate например в следующую пятницу - PullRequest
3 голосов
/ 22 мая 2010

Я хочу создать функцию, которая выводит дату следующей пятницы, но у меня нет плана, как это сделать. Есть кто-нибудь хороший намек на меня?

Ответы [ 5 ]

2 голосов
/ 21 сентября 2011

Вот мое рабочее решение для получения следующих 5 воскресений в григорианском календаре:

self.nextBeginDates = [NSMutableArray array];

NSDateComponents *weekdayComponents = [[NSCalendar currentCalendar] components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
int currentWeekday = [weekdayComponents weekday]; //[1;7] ... 1 is sunday, 7 is saturday in gregorian calendar

NSDateComponents *comp = [[NSDateComponents alloc] init];
[comp setDay:8 - currentWeekday];   // add some days so it will become sunday

// build weeks array
int weeksCount = 5;
for (int i = 0; i < weeksCount; i++) {
    [comp setWeek:i];   // add weeks

    [nextBeginDates addObject:[[NSCalendar currentCalendar] dateByAddingComponents:comp toDate:[NSDate date] options:0]];
}
[comp release];
2 голосов
/ 22 мая 2010

например. Получите текущую дату, используя NSDate, затем используйте «components> fromDate:» из NSCalendar, чтобы получить NSDateComponents, затем добавьте разницу во времени к следующей пятнице и создайте новую NSDate, и Боб - ваш дядя.

1 голос
/ 12 февраля 2013

Это должно работать

+ (NSDate *) dateForNextWeekday: (NSInteger)weekday {

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

// Get the weekday component of the current date
NSDateComponents *weekdayComponents = [gregorian components:NSWeekdayCalendarUnit
                                                   fromDate:today];

/*
 Add components to get to the weekday we want
 */
NSDateComponents *componentsToSubtract = [[NSDateComponents alloc] init];
NSInteger dif = weekday-weekdayComponents.weekday;
if (dif<=0) dif += 7;
[componentsToSubtract setDay:dif];

NSDate *beginningOfWeek = [gregorian dateByAddingComponents:componentsToSubtract
                                                     toDate:today options:0];

return beginningOfWeek;

}

0 голосов
/ 18 июля 2013

Сохраняйте это простым, безопасным и читабельным! (.... KISSAR?)

#define FRIDAY 6

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dayComponent = [[NSDateComponents alloc] init];
dayComponent.day = 1;

NSDate *nextFriday = [NSDate date];
NSInteger iWeekday = [[gregorian components:NSWeekdayCalendarUnit fromDate:nextFriday] weekday];

while (iWeekday != FRIDAY) {
    nextFriday = [gregorian dateByAddingComponents:dayComponent toDate:nextFriday options:0];
    iWeekday = [[gregorian components:NSWeekdayCalendarUnit fromDate:nextFriday] weekday];
}

Теперь nextFriday имеет вашу дату.

Надеюсь, это поможет!

EDIT Обратите внимание, что если текущая дата уже была пятницей, она вернет ее вместо следующей пятницы. Если это нежелательно, просто начните вводить nextFriday днем ​​позже (так, если бы текущая дата была пятницей, она начиналась бы в субботу, форсируя следующую пятницу. И если бы текущая дата была четвергом, вы автоматически получили бы следующую пятницу без необходимости петля).

0 голосов
/ 25 мая 2010

Вот мое решение, и, чтобы предупредить вас, в субботу перед показом будет пятница.ура всем

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

NSDateComponents *weekdayComponents = [gregorian components:NSWeekdayCalendarUnit fromDate:today];
int weekday = [weekdayComponents weekday];


int iOffsetToFryday = -weekday + 6;
weekdayComponents.weekday = iOffsetToFryday;

NSDate *nextFriday = [[NSCalendar currentCalendar] dateByAddingComponents:weekdayComponents toDate:today options:0];
...