计算xcode中时间差异中的闰年天数

时间:2012-05-16 18:44:18

标签: objective-c ios5 xcode4.2

我正在尝试确定应用程序返回到19C的两个不同日期之间的闰年天数 - 这是一个方法示例:

-(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

}

所以我有几天之间的总天数。现在我需要减去闰年的数量???

PS - 我知道这个例子有两个闰年,但应用程序可以追溯到19世纪......

3 个答案:

答案 0 :(得分:3)

Swift

.s1 {
    background-color: red;
}
.s2 {
    background-color: green;
}
.s3 {
    background-color: blue;
}

答案 1 :(得分: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

这将为您提供闰年的数量,从而为您提供需要减去的闰年数。 可能有更有效的方法,但这是我现在能想到的最简单的方法。

答案 2 :(得分: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;    
}