16

我正在向我正在开发的 Cocoa 应用程序添加重复事件。我每天和每周都重复,因为我可以用数学方法定义这些(3600*24*7 = 1 周)。我使用以下代码来修改日期:

[NSDate dateWithTimeIntervalSinceNow:(3600*24*7*(weeks))]

我知道自从事件重复以来已经过去了几个月,但我不知道如何制作一个代表未来 1 个月/3 个月/6 个月/9 个月的 NSDate 对象。理想情况下,我希望用户说从 10 月 14 日开始每月重复一次,它将在每个月的 14 号重复一次。

4

5 回答 5

37

(几乎和这个问题一样。)

文档中:

强烈建议不要使用 NSCalendarDate。它还没有被弃用,但它可能会在 Mac OS X v10.5 之后的下一个主要操作系统版本中出现。对于日历计算,您应该使用 NSCalendar、NSDate 和 NSDateComponents 的合适组合,如Cocoa 的日期和时间编程主题中的日历中所述。

遵循该建议:

NSDate *today = [NSDate date];

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *components = [[NSDateComponents alloc] init];
components.month = 1;
NSDate *nextMonth = [gregorian dateByAddingComponents:components toDate:today options:0];
[components release];

NSDateComponents *nextMonthComponents = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit fromDate:nextMonth];

NSDateComponents *todayDayComponents = [gregorian components:NSDayCalendarUnit fromDate:today];

nextMonthComponents.day = todayDayComponents.day;
NSDate *nextMonthDay = [gregorian dateFromComponents:nextMonthComponents];

[gregorian release];

可能会有更直接或更有效的实现,但这应该是准确的,并且应该指向正确的方向。

于 2008-10-09T06:20:02.847 回答
22

使用 NSCalender、NSDateComponents 和 NSDate:

NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
components.month = 1;
NSDate *oneMonthFromNow = [[NSCalendar currentCalendar] dateByAddingComponents:components toDate:[NSDate date] options:0];

只需设置不同的属性components即可获得不同的时间段(例如 3 个月、6 个月等)。

注意:根据上下文,如果“1 个月”的意思是“公历上的 1 个月” ,您可能想要使用[[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]而不是。[NSCalendar currentCalendar]

于 2010-04-05T05:01:49.937 回答
0

我可能会使用 NSCalendarDate。

获取当前日期的 dayOfMonth、monthOfYear 和 yearOfCommonEra,作为三个数字。

添加所需的月数(1/3/6/9),注意 1)该日期是否存在(例如,非闰年的 4 月 31 日、2 月 29 日),以及 2)年的展期。

使用 NSCalendarDate 的 initWithYear:month:day:hour:minute:second:timeZone 创建新日期:

于 2008-10-09T04:17:22.300 回答
0

新 SDK 不再支持NSCalendarDate ,在构建分发时会出现问题。

于 2009-02-16T07:31:16.620 回答
0

您可以执行以下操作:

NSDate *today = [NSDate date];

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *components = [[NSDateComponents alloc] init];
components.month = 1;
NSDate *nextMonth = [gregorian dateByAddingComponents:components toDate:today options:0];
[components release];

NSDateComponents *nextMonthComponents = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:nextMonth];
NSDate *nextMonthDay = [gregorian dateFromComponents:nextMonthComponents];

[gregorian release]; 
于 2012-07-17T06:23:24.193 回答