количество календарных недель в году (определение ISO 8601) - PullRequest
0 голосов
/ 14 марта 2012

как рассчитать количество календарных недель в объективе-C для данного года.

Я пытался:

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

но возвращает 54.

Спасибо

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Вы используете 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

Наконец, обратите внимание, что NSWeekOfYearCalendarUnit и NSYearForWeekOfYearCalendarUnit предназначены только для iOS 5.0 и OS X 10.7.

Редактировать

As@lnafziger, если вы используете дату календарной недели предыдущего года или следующего года, например, 01.01.2016, будет подсчитано количество недель в этом году (в примере 2015), а нефактический год даты (например, 2016).Если это не то, что вы хотите, вы можете изменить дату следующим образом:

NSDateComponents *components = [calendar components:NSYearCalendarUnit fromDate:date];
components.month = 3;
date = [calendar dateFromComponents:components];
2 голосов
/ 14 марта 2012

После значительного количества испытаний, вот функция, которая будет возвращать его за любой год:

- (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-летнего цикла (начиная с года 0 и года 2000), и все случаи соответствуют спецификации.

...