1

19世紀にさかのぼるアプリの2つの異なる日付の間のうるう年の日数を決定しようとしています-これがメソッドの例です:

-(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 - この例ではうるう年が 2 日あることはわかっていますが、アプリは 19 世紀にさかのぼります...

4

3 に答える 3

1

簡単な解決策は、2 つの日付の間のすべての年を反復処理し、うるう年の場合は関数を呼び出してカウンターをインクリメントすることです。(ウィキペディアより)

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

これにより、うるう年の数が得られるため、減算する必要があるうるう年の日数が得られます。もっと効率的な方法があるかもしれませんが、これは私が今考えることができる最も簡単な方法です。

于 2012-05-16T18:54:26.293 に答える
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;    
}
于 2012-05-16T19:04:09.427 に答える