计算一年中所有周的第一天和最后一天

##准备

在看代码之前你可能需要先了解以下知识

* [NSDate、NSCalendar和NSDateComponents](https://www.jianshu.com/p/d0e56b09179a)

* [NSCalendar使用详解](https://blog.csdn.net/awaylin113/article/details/39557969)

##代码

```objc

  - (void)weeksWithDateComponents:(NSDateComponents *)fromComp

              toDateComponents:(NSDateComponents *)toComp{

    //获取公历日历

    NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];

    //一年中的天数或一年已过的天数

    NSInteger daysOfYear = 0;

    if (toComp) {//计算已过的天数

        daysOfYear = [calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:[calendar dateFromComponents:toComp]];

    }else{//计算一年的天数

//        daysOfYear = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:[calendar dateFromComponents:fromComp]].length;//在9.3系统里始终是31天

        /*fixed 9.3 bug*/

        for (NSInteger i = 1; i <= 12; i++) {

            fromComp.month = i;

            fromComp.day = 1;

            NSDate *date = [calendar dateFromComponents:fromComp];

            daysOfYear += [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date].length;

        }

    }

    //月份移动至1月

    fromComp.month = 1;

    //记录当前第几周

    NSInteger weekOfYear = 0;

    //遍历每一天

    for (NSInteger i = 1; i <= daysOfYear; i++) {

        @autoreleasepool {

            //移至当前天

            fromComp.day = i;

            NSDate *idate = [calendar dateFromComponents:fromComp];

            NSDateComponents *comp = [calendar components:kCFCalendarUnitDay|kCFCalendarUnitWeekday|kCFCalendarUnitMonth fromDate:idate];

            //如果是周日或者一年的最后一天不是周日就将其计为一周

            if ((i == daysOfYear&&comp.weekday != 1)||comp.weekday == 1) {//最后一天

                weekOfYear += 1;

                if (comp.weekday == 1) {

                    fromComp.day = MAX(i-6,1);

                }else {

                    fromComp.day = i-(comp.weekday-2);

                }

                NSDate *fdate = [calendar dateFromComponents:fromComp];

                NSString *reslut = [NSString stringWithFormat:@"第%zd周 (%zd月%zd日-%zd月%zd日)",weekOfYear,

                                    [calendar ordinalityOfUnit:NSCalendarUnitMonth inUnit:NSCalendarUnitYear forDate:fdate],

                                    [calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:fdate],

                                    [calendar ordinalityOfUnit:NSCalendarUnitMonth inUnit:NSCalendarUnitYear forDate:idate],

                                    [calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:idate]];

                NSLog(@"%@",reslut);

            }

        }

    }

}

```

##使用

```objc

    NSDateComponents * fComp = [[NSCalendar currentCalendar] components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[NSDate date]];

    fComp.month = 1;

    fComp.day = 1;


    NSDateComponents * tComp = [[NSCalendar currentCalendar] components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[NSDate date]];


    [self weeksWithDateComponents:fComp toDateComponents:tComp];

```

你可能感兴趣的:(计算一年中所有周的第一天和最后一天)