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

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

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

有帮助吗?

解决方案

(几乎与这个问题相同。)

来自文档

  

强烈使用NSCalendarDate   泄气。它尚未弃用,   但它可能在下一个主要操作系统中   在Mac OS X v10.5之后发布。对于   日历计算,你应该   使用合适的组合   NSCalendar,NSDate和   NSDateComponents,如中所述   日期和时间的日历   可可的编程主题

遵循以下建议:

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];

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

其他提示

使用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个月等)。

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

我可能会使用NSCalendarDate。

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

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

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

新SDK不再支持

NSCalendarDate ,在构建分发时会出现问题。

你可以这样做:

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]; 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top