成立条件
- 情况1:年份Year相等,且这一周所在年的周次WeekOfYear相等
- 情况2:年份Year不相等,但是也可能属于同一周。需要yearForWeekOfYear和weekOfYear相等即可(条件包含情况1)
推荐方案
#pragma mark 判断是否是同一周
- (BOOL)isSameWeek:(NSDate *)date1 date2:(NSDate *)date2 {
// 日历对象
NSCalendar *calendar = [NSCalendar currentCalendar];
// 一周开始默认为星期天=1。
calendar.firstWeekday = 1;
unsigned unitFlag = NSCalendarUnitWeekOfYear | NSCalendarUnitYearForWeekOfYear;
NSDateComponents *comp1 = [calendar components:unitFlag fromDate:date1];
NSDateComponents *comp2 = [calendar components:unitFlag fromDate:date2];
/// 年份和周数相同,即判断为同一周
/// NSCalendarUnitYearForWeekOfYear已经帮转换不同年份的周所属了,比如2019.12.31是等于2020的。这里不使用year,使用用yearForWeekOfYear
return (([comp1 yearForWeekOfYear] == [comp2 yearForWeekOfYear]) && ([comp1 weekOfYear] == [comp2 weekOfYear]));
}
注意:[calendar components: fromDate: toDate: options:];这样是不行的,这是比较时间差,时间差为7天内的就为0了。
有评论提醒:不同年份判断是有问题的。所以下面方案不能使用,后期会删除掉
-
(BOOL)isSameWeek:(NSDate *)date1 date2:(NSDate *)date2 {
// 日历对象
NSCalendar *calendar = [NSCalendar currentCalendar];
// 一周开始默认为星期天=1。
calendar.firstWeekday = 1;unsigned unitFlag = NSCalendarUnitYear | NSCalendarUnitWeekOfYear;
NSDateComponents *comp1 = [calendar components:unitFlag fromDate:date1];
NSDateComponents *comp2 = [calendar components:unitFlag fromDate:date2];
return (([comp1 year] == [comp2 year]) && ([comp1 weekOfYear] == [comp2 weekOfYear]));
}
说明如图:
image.png
日期2019年12月31日的参数为:
NSDateComponents: {
Calendar Year: 2019 // 说明:年份为2019年
Year for Week of Year: 2020 // 说明:周数年份为2020年,而不是2019年
Week of Year: 1 // 说明:这天所在周次为今年的第1周
}
日期2020年01月01日的参数为:
NSDateComponents: {
Calendar Year: 2020 // 说明:年份为2020年
Year for Week of Year: 2020 // 说明:周数年份为2020年
Week of Year: 1 // 说明:这天所在周次为今年的第1周
}
firstWeekday:1.周日 2.周一 3.周二 4.周三 5.周四 6.周五 7.周六
当calendar.firstWeekday = 1;,起始为星期天,则2019年12月29日~2020年01月04日为同一周。
当calendar.firstWeekday = 2;,起始为星期一,则2019年12月30日~2020年01月05日为同一周。