準備
在看代碼之前你可能需要先了解以下知識
代碼
- (void)weeksWithDateComponents:(NSDateComponents *)fromComp
toDateComponents:(NSDateComponents *)toComp{
//獲取公歷日歷
NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
//一年中的天數(shù)或一年已過的天數(shù)
NSInteger daysOfYear = 0;
if (toComp) {//計算已過的天數(shù)
daysOfYear = [calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:[calendar dateFromComponents:toComp]];
}else{//計算一年的天數(shù)
// daysOfYear = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:[calendar dateFromComponents:fromComp]].length;//在9.3系統(tǒng)里始終是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 (comp.weekday == 2) {
weekOfYear += 1;
fromComp.day = MIN(i+6,daysOfYear);
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);
}
}
}
}
使用
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];