如何计算目标C中今年的天数

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)

它并不像我希望的那样整洁,但它适用于任何日历,如普通的格里高利或伊斯兰日历.


Ole*_*lex 8

一般情况下,您可以使用一年中的第一天和下一年的第一天之间的天数.以下是说明此方法的代码

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


Wil*_*ens 5

我不知道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)

  • 请注意,该算法将在 1582 年之前的年份(引入闰年之前)失效;-) (5认同)
  • 这并不是我真正想要的,因为它只适用于公历。 (5认同)