如何向 NSDate 添加周数?

How to add a number of weeks to an NSDate?

我过去曾使用以下函数使用 NSDateComponents 添加特定时间间隔到现有日期。

(NSDate *)dateByAddingComponents:(NSDateComponents *)comps
                          toDate:(NSDate *)date
                         options:(NSCalendarOptions)opts

从 iOS8 开始,NSDateComponents 的周值已弃用,这意味着我无法实现我想做的事情:通过添加一定数量的给定 NSDate 周。

如有任何帮助,我们将不胜感激。

更新:正如 Zaph 在他的回答中所说,Apple 实际上建议使用 weekOfYearweekOfMonth 而不是我提供的答案。详情请查看 Zaph 的回答。


您可能很快就会意识到自己想多了,但是即使周值已被弃用,您也可以通过以下方式向日期添加特定周数,例如:

NSDateComponents *comp = [NSDateComponents new];
int numberOfDaysInAWeek = 7;
int weeks = 3; // <-- this example adds 3 weeks
comp.day = weeks * numberOfDaysInAWeek;

NSDate *date = [[NSCalendar currentCalendar] dateByAddingComponents:comp toDate:date options:0];

您可以通过以下方法在 NSDate 上添加分类:

- (NSDate *) addWeeks:(NSInteger)weeks
{
    NSCalendar *gregorian=[[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDateComponents *components=[[NSDateComponents alloc] init];
    components.day = weeks * 7;

    return [gregorian dateByAddingComponents:components toDate:self options:0];
}

只需使用 weekOfYear:

Apple 文档 NSDateComponents week

Deprecation Statement
Use weekOfYear or weekOfMonth instead, depending on what you intend.

NSDate *date = [NSDate date];
NSDateComponents *comp = [NSDateComponents new];
comp.weekOfYear = 3;
NSDate *date1 = [[NSCalendar currentCalendar] dateByAddingComponents:comp toDate:date options:0];
NSLog(@"date:  %@", date);
NSLog(@"date1: %@", date1);

输出:

     
date:  2015-01-13 04:06:26 +0000  
date1: 2015-02-03 04:06:26 +0000

如果您使用 week,您会收到此警告:

'week' is deprecated: first deprecated in ... - Use weekOfMonth or weekOfYear, depending on which you mean

当使用 weekOfMonthweekOfYear 作为增量时,它们的工作原理相同。它们的不同之处在于,当它们用于获取周数时,您将获得范围为 6 的月份中的周数或范围为 53 的年中的周数。

我更喜欢使用 dateByAddingUnit。更直观

return [NSDate[[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitMonth value:3 toDate:toDate options:0];