我正在向我正在处理的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的合适组合,如日期中的Calendars 和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];
可能有更直接或有效的实施,但这应该是准确的,并应指向正确的方向.
使用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个月".