题
我正在向我正在处理的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:
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];