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

时间:2017-01-24 10:06:17

标签: ios nsdatecomponents

我目前正在更新使用NSDateComponents来计算给定NSDate所在星期的开始日期的旧iOS应用:

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都已弃用。用新NSYearCalendarUnit替换NSCalendarUnitYear没问题。但它对NSWeekCalendarUnit的正确替换是什么。

似乎NSWeekCalendarUnit返回与新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返回相同的周值(第35周),但似乎在从NSDateComponents对象计算日期时不考虑此值。 2017-01-01显然不是2017年第35周开始的日期。

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

1 个答案:

答案 0 :(得分:0)

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

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

然后把它放到一些日期组件中:

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

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

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