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

这很好用,但 NSYearCalendarUnitNSWeekCalendarUnit 都已弃用。用新的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 方法

在 Android 中,如何删除已弃用的通知变量?

如何在不使用已弃用的类的情况下编写 Hadoop map reduce 作业?

我应该如何在 Android 中使用/不使用已弃用的方法

如何正确更新已弃用的 Android BillingFlowParams 方法

如何安装已弃用的 uws 版本