2012-04-15 7 views
0

Zum Beispiel:Erhalten Sie das letzte Auftreten eines Datums um ein bestimmtes Intervall mit einem bestimmten ursprünglichen Datum im Verlauf?

Original-Datum: 23.03.2012 Intervall: alle 2 Wochen

Ausgang: letztes Auftreten -> 06.04.2012

Wie kann ich dies den besten Weg erreichen in Ziel-C (iOS)?

Nebenbei bemerkt: Meine aktuelle nicht so funktioniert und wirklich schlechte Lösung:

+ (NSDate *) getRelativeStartDateForIntervalType:(NSInteger)intervalType andStartDateTime:(NSDate *)startDateTime { 
    NSDateComponents *components = [[NSDateComponents alloc] init]; 
    BOOL found = false; 
    NSDate *relativeStartDate; 
    NSDate *previousDate; 
    for (int i = 0; !found ; i++) { 
     previousDate = relativeStartDate; 

     switch (intervalType) { 
      case 0: 
       [components setDay:i]; // add i days 
       break; 
      case 1: 
       [components setWeek:i]; // add i weeks 
       break; 
      case 2: 
       [components setMonth:i]; // add i months 
       break; 
      case 3: 
       [components setDay:i]; // add i weeks 
       break; 
      default: 
       NSLog(@"you shouldn't be here"); 
       break; 
     } 
     relativeStartDate = [[NSCalendar currentCalendar] dateByAddingComponents:components toDate:startDateTime options:0]; 
     if ([relativeStartDate compare:[NSDate date]] == NSOrderedDescending) { 
      found = true; 
      if (i > 0 && [previousDate compare:[NSDate date]] == NSOrderedDescending) { 
       relativeStartDate = previousDate;     
      } 
     } 
    } 
    return relativeStartDate; 
} 

Antwort

0

für „every N Wochen“ oder „alle N Tage“, nehmen Sie nur die Differenz in Tagen zwischen dem Startdatum und dem Ziel Datum, dividiere durch die Anzahl der Tage im Intervall und gehe vom Restdatum zum Zieldatum zurück.

Das heißt, in Pseudo-Code, relativeStartDate = targetDate - ((targetDate - startDate) % intervalSize)

Für „alle N Monate“, man muss nur auf die jüngsten Auftreten des gleichen Tages des Monats zurück. Keine saubere Möglichkeit, dies zu tun, außer einer bedingten. Wenn das Ziel mday größer als das Startdatum ist, dann ist es nur das Zieldatum, wobei der Tag des Monats durch den Tag des Monats des Startdatums ersetzt wird. Ansonsten ist es ein Monat vor dem Zieldatum mit der gleichen Ersetzung.

Sie müssen auch entscheiden, wie Sie mit Tagen umgehen, die in einem bestimmten Monat nicht existieren; dauert ein Monat vom 31. Mai bis zum 30. Juni oder 1. Juli?