NSDateComponents:如何将已弃用的 NSWeekCalendarUnit 替换为计算周开始日期?

NSDateComponents: How to replace deprecated NSWeekCalendarUnit to calc week start date?

我目前正在更新一个旧的 iOS 应用程序,该应用程序使用 NSDateComponents 计算给定 NSDate 所在周的开始日期:

NSDate* someDate = [MyDateFactory dateFromDay:31 month:8 year:2017];

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comps = [calendar components:(NSYearCalendarUnit | NSWeekCalendarUnit) fromDate:someDate];

// For 2017-08-31 comps is now year=2017, week (obsolete)=35

comps.calendar = calendar;
NSDate* weekStartDate = [comps date];

// weekStartDate = 2017-08-27

这很好用,但是 NSYearCalendarUnitNSWeekCalendarUnit 都被弃用了。用新的 NSCalendarUnitYear 替换 NSYearCalendarUnit 没问题。但它是 NSWeekCalendarUnit.

的正确替代品

似乎 NSWeekCalendarUnit returns 与新的 NSCalendarUnitWeekOfYear 具有相同的值(一年中的第几周)。 但这不会导致相同的 weekStartDate:

// ... same as above. Now use new enum values
NSDateComponents *comps = [calendar components:(NSCalendarUnitYear | NSCalendarUnitWeekOfYear) fromDate:someDate];

// For 2017-08-31 comps is now year=2017, week of year=35 <== Same es above

comps.calendar = calendar;
NSDate* weekStartDate = [comps date];

// weekStartDate = 2017-01-01

所以使用 NSCalendarUnitWeekOfYear returns 相同的周值(第 35 周),但在从 NSDateComponents 对象计算日期时似乎没有考虑该值。 2017-01-01 显然不是 2017 年第 35 周开始的日期。

那么,如何解决这个问题?

您可以使用NSCalendar的其他方法代替。

要获取周开始的日期,请使用 calendar.firstWeekday

然后将其放入一些日期组件中:

NSDateComponents *search = [[NSDateComponents alloc] init];
search.weekDay = calendar.firstWeekday;

现在您可以使用日历查找与组件匹配的上一个日期:

NSDate *weekStart = [calendar nextDateAfterDate: someDate matchingComponents: search options: NSCalendarSearchBackwards];