获取给定月份的开始日期和结束日期的所有周(NSDate Objective C)
在Objective-C中,可以使用NSCalendar和NSDateComponents类来获取给定月份的开始日期和结束日期的所有周。
首先,我们需要创建一个NSCalendar对象,并设置它的firstWeekday属性为1,以确保每周的第一天是星期日。
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
calendar.firstWeekday = 1;
接下来,我们需要创建一个NSDateComponents对象,并设置它的year和month属性为给定的年份和月份。
NSDateComponents *components = [[NSDateComponents alloc] init];
components.year = year;
components.month = month;
然后,我们可以使用NSCalendar的rangeOfUnit:inUnit:forDate:方法来获取给定月份的起始日期和结束日期。
NSDate *startDate;
NSDate *endDate;
[calendar rangeOfUnit:NSCalendarUnitMonth startDate:&startDate interval:NULL forDate:[calendar dateFromComponents:components]];
components.month += 1;
components.day -= 1;
[calendar rangeOfUnit:NSCalendarUnitDay startDate:NULL interval:NULL forDate:[calendar dateFromComponents:components]];
endDate = [endDate dateByAddingTimeInterval:24 * 60 * 60]; // 加一天,使结束日期包含在下个月
最后,我们可以使用NSCalendar的enumerateDatesStartingAfterDate:matchingComponents:options:usingBlock:方法来遍历每个周的起始日期和结束日期。
NSMutableArray *weeks = [NSMutableArray array];
[calendar enumerateDatesStartingAfterDate:startDate matchingComponents:[NSDateComponents new] options:NSCalendarMatchNextTime usingBlock:^(NSDate * _Nullable date, BOOL exactMatch, BOOL * _Nonnull stop) {
NSDate *weekStartDate;
NSDate *weekEndDate;
[calendar rangeOfUnit:NSCalendarUnitWeekOfMonth startDate:&weekStartDate interval:NULL forDate:date];
weekEndDate = [weekStartDate dateByAddingTimeInterval:6 * 24 * 60 * 60]; // 加六天,得到周的结束日期
if ([weekEndDate compare:endDate] == NSOrderedDescending) {
*stop = YES; // 停止遍历
} else {
[weeks addObject:@{@"start": weekStartDate, @"end": weekEndDate}];
}
}];
现在,我们可以使用weeks数组来获取给定月份的所有周的起始日期和结束日期。
完整的代码示例如下:
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
calendar.firstWeekday = 1;
NSDateComponents *components = [[NSDateComponents alloc] init];
components.year = year;
components.month = month;
NSDate *startDate;
NSDate *endDate;
[calendar rangeOfUnit:NSCalendarUnitMonth startDate:&startDate interval:NULL forDate:[calendar dateFromComponents:components]];
components.month += 1;
components.day -= 1;
[calendar rangeOfUnit:NSCalendarUnitDay startDate:NULL interval:NULL forDate:[calendar dateFromComponents:components]];
endDate = [endDate dateByAddingTimeInterval:24 * 60 * 60];
NSMutableArray *weeks = [NSMutableArray array];
[calendar enumerateDatesStartingAfterDate:startDate matchingComponents:[NSDateComponents new] options:NSCalendarMatchNextTime usingBlock:^(NSDate * _Nullable date, BOOL exactMatch, BOOL * _Nonnull stop) {
NSDate *weekStartDate;
NSDate *weekEndDate;
[calendar rangeOfUnit:NSCalendarUnitWeekOfMonth startDate:&weekStartDate interval:NULL forDate:date];
weekEndDate = [weekStartDate dateByAddingTimeInterval:6 * 24 * 60 * 60];
if ([weekEndDate compare:endDate] == NSOrderedDescending) {
*stop = YES;
} else {
[weeks addObject:@{@"start": weekStartDate, @"end": weekEndDate}];
}
}];
这样,我们就可以使用weeks数组获取给定月份的所有周的起始日期和结束日期了。
注意:以上代码示例中,并未提及腾讯云相关产品和产品介绍链接地址,因为与获取给定月份的开始日期和结束日期的所有周无直接关联。如需了解腾讯云相关产品和产品介绍,请参考腾讯云官方文档或咨询腾讯云官方客服。
领取专属 10元无门槛券
手把手带您无忧上云