NSDateComponents:如何将已弃用的 NSWeekCalendarUnit 替换为计算周开始日期?
Posted
技术标签:
【中文标题】NSDateComponents:如何将已弃用的 NSWeekCalendarUnit 替换为计算周开始日期?【英文标题】:NSDateComponents: How to replace deprecated NSWeekCalendarUnit to calc week start date? 【发布时间】:2017-01-24 10:06:16 【问题描述】:我目前正在更新一个旧的 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
与新的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】:您可以改用NSCalendar
的其他方法。
要获取星期的开始日期,请使用calendar.firstWeekday
。
然后把它放到一些日期组件中:
NSDateComponents *search = [[NSDateComponents alloc] init];
search.weekDay = calendar.firstWeekday;
现在您可以使用日历查找与组件匹配的上一个日期:
NSDate *weekStart = [calendar nextDateAfterDate: someDate matchingComponents: search options: NSCalendarSearchBackwards];
【讨论】:
以上是关于NSDateComponents:如何将已弃用的 NSWeekCalendarUnit 替换为计算周开始日期?的主要内容,如果未能解决你的问题,请参考以下文章
如何更改已弃用的 beginSheetForDirectory 方法
如何在不使用已弃用的类的情况下编写 Hadoop map reduce 作业?