我怎样才能计算给定年份objective-C中的calendarweeks数量。

我试过了:

[calendar rangeOfUnit:NSWeekOfYearCalendarUnit inUnit: NSYearCalendarUnit forDate: [NSDate date]].length

但它返回54。

谢谢

有帮助吗?

解决方案

您正在使用 NSWeekOfYearCalendarUnit, ,所以你必须使用相应的较大的单位这是 NSYearForWeekOfYearCalendarUnit.

NSCalendar *calendar = [NSCalendar currentCalendar];
calendar.firstWeekday = 2;
calendar.minimumDaysInFirstWeek = 4;
int n = [calendar rangeOfUnit:NSWeekOfYearCalendarUnit inUnit:NSYearForWeekOfYearCalendarUnit forDate: [NSDate date]].length;
NSLog(@"%d", n); // 52

最后,请注意两者 NSWeekOfYearCalendarUnitNSYearForWeekOfYearCalendarUnit 仅适用于iOS5.0和OS X10.7。

编辑

正如@lnafziger所指出的那样,如果您使用的日期位于上一年或下一年的日历周中,例如1/1/2016,这将计算该年的周数(示例中为2015),而不是日期的实际年份(示例中为2016)。如果这不是你想要的,你可以改变日期如下:

NSDateComponents *components = [calendar components:NSYearCalendarUnit fromDate:date];
components.month = 3;
date = [calendar dateFromComponents:components];

其他提示

经过大量的测试,这是一个函数,将返回任何一年:

- (NSUInteger)iso8601WeeksForYear:(NSUInteger)year {
    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSDateComponents *firstThursdayOfYearComponents = [[NSDateComponents alloc] init];
    [firstThursdayOfYearComponents setWeekday:5]; // Thursday
    [firstThursdayOfYearComponents setWeekdayOrdinal:1]; // The first Thursday of the month
    [firstThursdayOfYearComponents setMonth:1]; // January
    [firstThursdayOfYearComponents setYear:year];
    NSDate *firstThursday = [calendar dateFromComponents:firstThursdayOfYearComponents];

    NSDateComponents *lastDayOfYearComponents = [[NSDateComponents alloc] init];
    [lastDayOfYearComponents setDay:31];
    [lastDayOfYearComponents setMonth:12];
    [lastDayOfYearComponents setYear:year];
    NSDate *lastDayOfYear = [calendar dateFromComponents:lastDayOfYearComponents];

    NSDateComponents *result = [calendar components:NSWeekCalendarUnit fromDate:firstThursday toDate:lastDayOfYear options:0];

    return result.week + 1;
}
.

基本上,每个规范,总周的总数与周四在年度的总数相同,这就是这计算的。

我已经测试了整个400年周期(从2000年开始,从2000年开始),所有病例都与规格相匹配。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top