количество календарных недель в году (определение ISO 8601)

StackOverflow https://stackoverflow.com//questions/9693466

Вопрос

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

Я пытался:

[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

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

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

Как отметил @lnafziger, если вы используете дату, которая находится в календарной неделе предыдущего или следующего года, например 01.01.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 лет (начиная в год 0 и 2000 год), и все случаи соответствуют спецификации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top