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

##准备

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

* [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];

```

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 常规获取当前时间等操作就不在赘述。这里分享下自己写的关于得到当前年、月、周的第一天和最后一天的方法。 在.h文件里...
    码农_会写诗阅读 507评论 0 1
  • 最近项目中用到了周 月的具体时间,就找了一下资料发现系统提供了获取日期的API,NSCalendar这个类,这里我...
    叶落似晚秋阅读 3,179评论 1 6
  • 归来却怪丹青手,入眼平生几曾有。 意态由来画不成,当时枉死毛延寿。 ――王安石《明妃曲》 师...
    玄默阅读 150评论 0 0
  • 我喜欢你 不是一见钟情 不能说停就停 只能任由这情感 温暖我余生时光 ——————————————————— 怕此...
    淡漠妖姬阅读 443评论 0 0
  • 01 昨天晚上,有位读者朋友在后台留言,问我到底该不该离婚。 对于这个正在遭受不幸的女人,我们暂且称呼她G女士吧。...
    我是姜燕妮阅读 415评论 0 1