God*_*emo 5 iphone objective-c
如何计算任何日历的一年中的天数,而不仅仅是格里高利.我试过这个
NSUInteger *days = [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:[NSDate date]];
但这给了我当月的天数而不是当年的天数.
God*_*emo 10
我终于想出了一个有效的解决方案.我所做的是先计算一年中的月数,然后计算每个月的天数.
代码如下所示:
NSUInteger days = 0;
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *today = [NSDate date];
NSDateComponents *components = [calendar components:NSYearCalendarUnit fromDate:today];
NSUInteger months = [calendar rangeOfUnit:NSMonthCalendarUnit
inUnit:NSYearCalendarUnit
forDate:today].length;
for (int i = 1; i <= months; i++) {
components.month = i;
NSDate *month = [calendar dateFromComponents:components];
days += [calendar rangeOfUnit:NSDayCalendarUnit
inUnit:NSMonthCalendarUnit
forDate:month].length;
}
return days;
Run Code Online (Sandbox Code Playgroud)
它并不像我希望的那样整洁,但它适用于任何日历,如普通的格里高利或伊斯兰日历.
一般情况下,您可以使用一年中的第一天和下一年的第一天之间的天数.以下是说明此方法的代码
- (NSDate *)firstDateOfYear:(NSInteger)year
{
NSDateComponents *dc = [[NSDateComponents alloc] init];
dc.year = year;
dc.month = 1;
dc.day = 1;
return [[NSCalendar currentCalendar] dateFromComponents:dc];
}
- (NSUInteger)numberOfDaysInYear:(NSInteger)year
{
NSDate *firstDateOfYear = [self firstDateOfYear:year];
NSDate *firstDateOfNextYear = [self firstDateOfYear:year + 1];
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit fromDate:firstDateOfYear toDate:firstDateOfNextYear options:0];
return [components day];
}
Run Code Online (Sandbox Code Playgroud)
我不知道objective-c,但它是一个简单的算法来确定是否是闰年。
if ( year % 400 == 0 )
then 366 // Leap Year
else if ( year % 100 == 0 )
then 365 // Non-Leap Year
else if ( year % 4 == 0 )
then 366 // Leap Year
else
365 // Non-Leap Year
Run Code Online (Sandbox Code Playgroud)
或者如果你想要一个不太冗长的版本
if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))
then 366 // Leap Year
else
365 // Non-Leap Year
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7059 次 |
最近记录: |