【问题标题】:calculate week numbers given month计算给定月份的周数
【发布时间】:2012-07-12 16:21:01
【问题描述】:

我想计算给定月份的周数。 例如,2012 年 7 月应该有第 26、27、28、29、30 和 31 周。 我制作了这个 sn-p,但我正在寻找一种可行的方法来获取前一周和后一周的数字。任何想法。

谢谢, 达雷尔。

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

【问题讨论】:

  • 我有一个包含文本信息的文件。我希望能够列出日期,然后计算一年中唯一的月份。我很自然地这样做。不过我可以使用 Cobol。

标签: objective-c xcode nscalendar nsdatecomponents


【解决方案1】:
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);

【讨论】:

    【解决方案2】:

    功能:

    - (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
    )}
    

    【讨论】:

      【解决方案3】:

      Anne 建议的解决方案对我有用,但输出的排序与她的输出不同。 我需要转换为数组并排序:

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

      这是合乎逻辑的步骤,是否有更性感的方法来做到这一点?

      【讨论】:

      • 更新函数返回排序数组,使用sortedArrayUsingDescriptors:确实是正确的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多