我目前正在更新使用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
这样可以正常使用,但NSYearCalendarUnit
和NSWeekCalendarUnit
都已弃用。用新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周开始的日期。
那么,如何解决这个问题呢?
答案 0 :(得分:0)
您可以使用NSCalendar
的其他方法。
要获得开始几周的日期,请使用calendar.firstWeekday
。
然后把它放到一些日期组件中:
NSDateComponents *search = [[NSDateComponents alloc] init];
search.weekDay = calendar.firstWeekday;
现在,您可以使用日历查找与组件匹配的上一个日期:
NSDate *weekStart = [calendar nextDateAfterDate: someDate matchingComponents: search options: NSCalendarSearchBackwards];