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
这很好用,但是 NSYearCalendarUnit
和 NSWeekCalendarUnit
都被弃用了。用新的 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];
我目前正在更新一个旧的 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
这很好用,但是 NSYearCalendarUnit
和 NSWeekCalendarUnit
都被弃用了。用新的 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];