2015-07-09 3 views
-2

Есть ли простой способ рассчитать даты по критериям с NSCalendar и/или NSCalendarComponents? Некоторое время я смотрел документацию, но это немного сложно. Например, мне нужно «Среда 6:00 вечера» для следующих 15 четных недель (включая эту, если она даже пронумерована, а не за эту дату/время.)Расчет некоторых NSDates из дней недели/недель лет

ответ

0

В итоге я ответил на свой вопрос. Это очень просто, когда вы знаете, что -[NSCalendar dateBySettingUnit:value:ofDate:options:] автоматически увеличивает шаг вперед до следующей подходящей даты.

NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierISO8601]; 

NSDate *date = [NSDate date]; 

// find the next Wednesday 6 o'clock 
date = [calendar dateBySettingUnit:NSCalendarUnitSecond value:0 ofDate:date options:0]; 
date = [calendar dateBySettingUnit:NSCalendarUnitMinute value:0 ofDate:date options:0]; 
date = [calendar dateBySettingUnit:NSCalendarUnitHour value:18 ofDate:date options:0]; 
date = [calendar dateBySettingUnit:NSCalendarUnitWeekday value:4 ofDate:date options:0]; 

// skip one week if it's not an even week 
NSDateComponents *components = [calendar components:NSCalendarUnitWeekOfYear fromDate:date]; 
date = [calendar dateByAddingUnit:NSCalendarUnitWeekOfYear value:components.weekOfYear % 2 toDate:date options:0]; 

// 15 weeks of this 
for (int i = 0; i < 15; i++) 
{ 
    NSDate *testDate = [calendar dateByAddingUnit:NSCalendarUnitWeekOfYear value:i * 2 toDate:date options:0]; 
    NSLog(@"Date: %@", testDate); 
} 
0

Вот способ определения того, Среда, чтобы начать с, а затем получить следующие 14 ровных недель. Это не учитывает временную часть вашего вопроса, но вы можете использовать аналогичные методы для обработки времени.

+ (NSArray *)nextFifteenEvenNumberedWeekWednesdays:(NSDate *)startingDate 
{ 
    static const NSInteger Wednesday = 4; 
    static const NSInteger OneDay = 60 * 60 * 24; 
    NSCalendar *calender = [NSCalendar currentCalendar]; 
    NSDateComponents *startingDateComponents = [calender components:(NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitWeekday | NSCalendarUnitWeekOfYear) 
                  fromDate:startingDate]; 

    // Go to the closest Wednesday 
    NSInteger daysToWednesday = Wednesday - startingDateComponents.weekday; 
    if (startingDateComponents.weekday > Wednesday) { 
     // We already passed wednesday, so go to the next wednesday 
     if (startingDateComponents.weekOfYear % 2 == 0) { 
      // If this date is past Wednesday but is on an even week, then moving to the next wednesday 
      // will be an odd week. So skip forward one week. 
      startingDate = [startingDate dateByAddingTimeInterval:7 * OneDay]; 
     } 
     daysToWednesday = 7 + daysToWednesday; // get the next Wednesday 
    } 
    startingDate = [startingDate dateByAddingTimeInterval:daysToWednesday * OneDay]; // Move to wednesday 

    NSMutableArray *wednesdays = [NSMutableArray array]; 
    for (NSInteger i = 0; i < 15; i++) { 
     // Add every other wednesday 
     [wednesdays addObject:[startingDate dateByAddingTimeInterval:14 * i * OneDay]]; 
    } 

    return [wednesdays copy]; 
} 
+1

Я придумал что-то еще, прежде чем увидел это. По-видимому, 'dateBySettingUnit' будет продвигаться к следующей дате, чтобы автоматически удовлетворить это изменение, поэтому нет, если нужны предложения или математические операции. –

Смежные вопросы