我正在尝试为一个可以追溯到19世纪的应用程序确定两个不同日期之间的闰年天数-这是一个方法示例:
-(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世纪……
发布于 2012-05-17 03:04:09
好吧,好吧,你把事情搞得太复杂了。我想这就是你想要的:
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;
}发布于 2015-06-08 15:57:15
对于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;
}发布于 2012-05-17 02:54:26
一个简单的解决方案是迭代两个日期之间的所有年份,如果是闰年,则调用函数递增计数器。(来自维基百科)
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这将得到闰年的数量,从而得出需要减去的闰年天数。也许还有更有效的方法,但这是我现在能想到的最简单的方法。
https://stackoverflow.com/questions/10624696
复制相似问题