如何在目标c中获得该月的第n个星期天日期?
如何在对象C编码中获得第一个星期日或第n个星期日或星期一(任何一天)日期。
例如: – 我只想每年在我的应用程序中显示友谊日的日期。
但是,友谊来自8月的第一个周日。所以,日期将每年都在变化。 在这里,我需要找到每年8月的第一个星期日的日期。
我需要最好的逻辑来找到第n个星期日的日期。 请说出逻辑,谢谢
您需要创建一个NSDateComponents对象并设置适当的值,在您的示例中,您将执行以下操作:
NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; dateComponents.year = 2011; // set the current year or whatever year you want here dateComponents.month = 8; dateComponents.weekday = 1; // sunday is 1, monday is 2, ... dateComponents.weekdayOrdinal = 1; // this means, the first of whatever weekday you specified
要将其转换为NSDate对象,您只需:
//you may want to use another calendar object here NSDate *myDate = [[NSCalendar currentCalendar] dateFromComponents:dateComponents]; [dateComponents release]; //don't forget memory management ;)
您希望将NSDateComponents
与NSCalendar
的dateFromComponents:
方法结合使用:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *c = [[NSDateComponents alloc] init]; [c setYear:2012]; [c setWeekday:1]; // Sunday [c setWeekdayOrdinal:3]; // The 3rd Sunday for (int i = 1; i <= 12; i++) { [c setMonth:i]; NSDate *date = [gregorian dateFromComponents:c]; NSLog(@"Date[%i]: %@",i,date); } [c release]; [gregorian release];
这是一个例子。 您可以在“ 日期和时间编程指南”中找到更多信息。
要找到八月的第一个星期天:
NSDateComponents *components = [[NSDateComponents alloc] init]; [components setWeekday:1]; // Sunday [components setWeekdayOrdinal:1]; // The first Sunday in the month [components setMonth:8]; // August [components setYear:2011]; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDate *date = [gregorian dateFromComponents:components];
你检查一个月的第一天。
unsigned units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *components = [gregorian components:units fromDate:date];
使用[组件日]获取一天; 星期日<-1。这之后很简单。
您需要在此处查看NSCalendar
类。
特别感兴趣的是方法- (NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date