2012-05-16 3 views
0

Я пытаюсь определить количество дней високосного года между двумя разными датами для приложения, которое возвращается к XIXC - вот пример метода:Подсчитайте количество дней високосного года в временной разнице в xcode

-(NSInteger)leapYearDaysWithinEraFromDate:(NSDate *) startingDate toDate:(NSDate *) endingDate { 

// this is for testing - it will be changed to a datepicker object 
NSDateComponents *startDateComp = [[NSDateComponents alloc] init]; 
[startDateComp setSecond:1]; 
[startDateComp setMinute:0]; 
[startDateComp setHour:1]; 
[startDateComp setDay:14]; 
[startDateComp setMonth:4]; 
[startDateComp setYear:2005]; 

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

//startDate declared in .h// 
startDate = [GregorianCal dateFromComponents:startDateComp]; 
NSLog(@"This program's start date is %@", startDate); 


NSDate *today = [NSDate date]; 
NSUInteger unitFlags = NSDayCalendarUnit; 
NSDateComponents *temporalDays = [GregorianCal components:unitFlags fromDate:startDate toDate:today options:0]; 

NSInteger days = [temporalDays day]; 

// then i will need code for the number of leap year Days 

return 0;//will return the number of 2/29 days 

} 

Таким образом, у меня есть число TOTAL дней между датами. Теперь мне нужно вычесть количество високосных дней ???

PS - Я знаю, что есть два високосный год дней в этом примере, но приложение будет вернуться к 19-м веке ...

ответ

0

Хорошо, хорошо, вы это напуганы. Я думаю, что это то, что вы хотите:

NSUInteger leapYearsInTimeFrame(NSDate *startDate, NSDate *endDate) 
{ 
    // check to see if it's possible for a leap year (e.g. endDate - startDate > 1 year) 
    if ([endDate timeIntervalSinceDate:startDate] < 31556926) 
     return 0; 

    // now we go year by year 
    NSUInteger leapYears = 0; 
    NSUInteger startYear = [[NSCalendar currentCalendar] components:NSYearCalendarUnit fromDate:startDate].year; 
    NSUInteger numYears = [[NSCalendar currentCalendar] components:NSYearCalendarUnit fromDate:endDate].year - startYear; 

    for (NSUInteger currentYear = startYear; currentYear <= (startYear + numYears); currentYear++) { 
     if (currentYear % 400 == 0) 
      // divisible by 400 is a leap year 
      leapYears++; 
     else if (currentYear % 100 == 0) 
      /* not a leap year, divisible by 100 but not 400 isn't a leap year */ 
      continue; 
     else if (currentYear % 4 == 0) 
      // divisible by 4, and not by 100 is a leap year 
      leapYears++; 
     else 
      /* not a leap year, undivisble by 4 */ 
      continue; 
    } 

    return leapYears;  
} 
+0

Это будет отключено на один, если конечный год будет високосным годом. Тест должен быть currentYear <= (startYear + numYears). – Mark

+0

@RoshDamunki 1900 - не високосный год. Проверьте википедию, годы, делящиеся на 100, но не 400, а не високосные годы. –

+0

Да, я видел это сразу после публикации. Кажется, сейчас он отлично работает. Спасибо спасибо – RoshDamunki

1

Простое решение перебрать все годы между двумя датами, и вызов функция увеличивает счетчик, если это високосный год. (Из Википедии)

if year modulo 400 is 0 then 
    is_leap_year 
else if year modulo 100 is 0 then 
    not_leap_year 
else if year modulo 4 is 0 then 
    is_leap_year 
else 
    not_leap_year 

Это даст вам число високосных лет, и, таким образом, число високосных года дней вам нужно вычитать. Могут быть более эффективные методы, но это самое простое, о котором я могу думать прямо сейчас.

+0

По крайней мере, вы могли бы дать пример ObjC кода. – Goppinath

1

Для Swift

func getLeapCount(startDate : NSDate , endDate : NSDate)-> Int{ 
    var intialDate = startDate 
    var dateComponent = NSDateComponents() 
    dateComponent.day = 1 
    var leapCount = 0; 
    var currentCalendar = NSCalendar.currentCalendar() 
     while (intialDate.compare(endDate) == NSComparisonResult.OrderedAscending) { 
      intialDate = currentCalendar.dateByAddingComponents(dateComponent, toDate: intialDate, options: NSCalendarOptions.allZeros)!    
      if self.isLeapYear(startDate){ 
       ++leapCount 
      } 
    } 

    return leapCount 
} 
func isLeapYear (year : NSDate)-> Bool{ 
    let cal = NSCalendar.currentCalendar() 
    let year = cal.component(NSCalendarUnit.CalendarUnitYear, fromDate: year) 
    return ((year%100 != 0) && (year%4 == 0)) || year%400 == 0; 
} 
+0

Я использовал код напрямую, потому что я использую Swift, но вопросник является программистом Objc. – Goppinath

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