1

特定の月の週数を計算したい。たとえば、2012年7月の月の週番号は26、27、28、29、30、31です。このスニペットを作成しましたが、前後の週番号を取得するための実用的な方法を探しています。何か案は。

ありがとう、ダレル。

//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);
4

3 に答える 3

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
)}
于 2012-07-12T21:22:22.063 に答える
1

アンが提案した解決策は私にとってはうまくいきますが、出力は彼女の出力のようにソートされていません。配列に変換して次のように並べ替える必要がありました。

// 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);
} 

これは、これを行うためのよりセクシーな方法があるという論理的なステップですか?

于 2012-07-19T19:58:58.503 に答える