当前位置:  开发笔记 > 编程语言 > 正文

修改NSDate代表从今天起1个月

如何解决《修改NSDate代表从今天起1个月》经验,为你挑选了2个好方法。

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

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

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



1> mmalc..:

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

从文档:

强烈建议不要使用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];

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


您对类似问题的链接对我不起作用:(

2> Nick Forge..:

使用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个月".

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有