2012-07-12 103 views
1

我想计算给定月份的周数。 例如,2012年7月应该有26,27,28,29,30和31周数。 我编写了这段代码,但我正在寻找一种可行的方法来获取前一周和后一周的数字。有任何想法吗。计算给定月份的周数

谢谢, Darrell。

//Get current week number 
NSCalendar *cal = [NSCalendar currentCalendar]; 
NSDateComponents *components = [cal components:NSWeekCalendarUnit fromDate:[NSDate date]]; 
NSInteger week = [components week]; 
NSLog(@"Week nummer: %d", (int)week); 

//Get week numbers in month 
[components weekOfYear]; 
NSRange weeksInMonth = [cal rangeOfUnit:NSWeekCalendarUnit 
          inUnit:NSMonthCalendarUnit 
         forDate:[cal dateFromComponents:components]]; 
NSLog(@"Weken in maand: %lu", weeksInMonth.length); 
+0

我有一个包含文本信息的文件。我希望能够得到一个日期列表,然后计算一年中唯一的月份。我自然而然地这样做。但是我可以使用Cobol。 – 2014-08-07 16:27:39

回答

4

功能:

- (NSArray *)weeksOfMonth:(int)month inYear:(int)year 
{ 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 

    NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease]; 
    [components setMonth:month]; 
    [components setYear:year]; 

    NSRange range = [calendar rangeOfUnit:NSDayCalendarUnit 
            inUnit:NSMonthCalendarUnit 
            forDate:[calendar dateFromComponents:components]]; 

    calendar = [NSCalendar currentCalendar]; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd"]; 
    NSMutableSet *weeks = [[NSMutableSet alloc] init ]; 

    for(int i = 0; i < range.length; i++) 
    {  
     NSString *temp = [NSString stringWithFormat:@"%4d-%2d-%2d",year,month,range.location+i]; 
     NSDate *date = [dateFormatter dateFromString:temp ]; 
     int week = [[calendar components: NSWeekOfYearCalendarUnit fromDate:date] weekOfYear]; 
     [weeks addObject:[NSNumber numberWithInt:week]]; 
    } 

    NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"" ascending:YES]; 
    NSArray *descriptors = [[NSArray alloc] initWithObjects:descriptor, nil]; 
    return [weeks sortedArrayUsingDescriptors:descriptors]; 
} 

用法:

NSArray *weeks = [self weeksOfMonth:7 inYear:2012]; 
NSLog(@"%@",weeks); 

输出:

{(
    27, 
    28, 
    29, 
    30, 
    31 
)} 
2
int year = 2012; 
int month = 7; 

NSCalendar *cal = [NSCalendar currentCalendar]; 
NSDate *date = nil; 
NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease]; 

[components setYear:year]; 
[components setMonth:month]; 
date = [cal dateFromComponents:components]; 
NSLog(@"starting week # %d = %@", [[cal components:NSWeekCalendarUnit fromDate:date] week], date); 

[components setMonth:month + 1]; 
[components setDay:-1]; 
date = [cal dateFromComponents:components]; 
NSLog(@"ending week # %d = %@", [[cal components:NSWeekCalendarUnit fromDate:date] week], date); 
1

的解决方案安妮sugested作品我,但输出不像她的输出那样排序。 我需要转换成一个数组,有点像:

// Sorting everything. 
NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES]; 
NSArray *weeks = [[self weeksOfMonth:7 inYear:2012]allObjects]; 
NSArray *sorters = [[NSArray alloc] initWithObjects:sorter, nil]; 
NSArray *sortedArray = [weeks sortedArrayUsingDescriptors:sorters]; 

for (NSNumber *element in sortedArray) 
{ 
    NSLog(@"%i",element.intValue); 
} 

这其中的逻辑步骤是有一个更性感的方式来做到这一点?

+0

使用'sortedArrayUsingDescriptors:'返回排序数组的更新函数的确是正确的。 – Anne 2012-07-20 06:20:23