【问题标题】:2 NSDateComponents - is it same week?2 NSDateComponents - 是同一周吗?
【发布时间】:2010-08-25 12:13:16
【问题描述】:

我有一个带有 BOOL 返回值和 2 个输入 (NSDateComponents *) 参数的函数。 我的麻烦是我有两个 NSDateComponents 值,我想知道这两个日期是否在同一个日历周内。我尝试了最简单的解决方案来解决问题,我的想法如下:

- (BOOL)isFunctionName:(NSDateComponents *)comp1 andParam:(NSDateComponents *)comp2 { return (([comp1 week] == [comp2 week]) && ([comp1 year] == [comp2 year])); }

但这是不正确的。 有什么办法可以解决?


编辑

所以我有一个从日期生成日期组件的函数。

-(NSDateComponents *)dateToDateComponents:(NSDate *)date { unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *dateComponents = [gregorian components:unitFlags fromDate:date]; [gregorian release]; return dateComponents; }

我这样称呼它:

if ([self isFunctionName: [self dateToDateComponents:startDate] and Param:[self dateToDateComponents:currentTripDate]]){ }

在我的测试期间,它返回 YES 我的所有日​​期(例如 2010.07.21 - 2010.08.18)

【问题讨论】:

    标签: objective-c nsdatecomponents


    【解决方案1】:

    这受到罗伯特的回答的启发。当一周超过两年时,我对其进行了一些调整以解决该问题,例如2012 年 12 月 31 日和 2013 年 1 月 1 日。

    - (BOOL)isOnSameWeekAsDate:(NSDate*)otherDate
    {
        NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
        unsigned unitFlags = NSCalendarUnitYearForWeekOfYear | NSCalendarUnitWeekOfYear;
    
        NSDateComponents *components = [calendar components:unitFlags fromDate:self];
        NSDateComponents *otherComponents = [calendar components:unitFlags fromDate:otherDate];
    
        return ( [components yearForWeekOfYear] == [otherComponents yearForWeekOfYear] && [components weekOfYear] == [otherComponents weekOfYear] );
    }
    

    【讨论】:

    • 我认为这就是答案。我在网络上的其他地方没有找到它。不过,您使用的常量已被弃用。
    • 您的答案在 iOS8 中不再有用...见nshipster.com/nscalendar-additions
    • 在iOS7等之前保留它...我试图为isOnPreviousWeek找到一个解决方案...你能轻松做到吗?
    【解决方案2】:

    NSDateComponent 类引用状态:

    重要提示: NSDateComponents 对象本身没有意义;你 需要知道它是什么日历 解释反对,你需要 知道这些值是否是绝对的 单位或数量的值 单位。

    比较NSDates 怎么样?

    - (BOOL) weekIsEqual:(NSDate *)date and:(NSDate *)otherDate {
      NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    
      NSDateComponents *dateComponents      = [gregorian components:NSWeekdayCalendarUnit | NSYearCalendarUnit fromDate:date];
      NSDateComponents *otherDateComponents = [gregorian components:NSWeekdayCalendarUnit | NSYearCalendarUnit fromDate:otherDate];
    
      return [dateComponents week] == [otherDateComponents week] && [dateComponents year] == [otherDateComponents year];
    }
    

    编辑: 在这一行:

     unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
    

    你没有通过NSWeekCalendarUnit,因此[dateComponent week]返回NSUndefinedDateComponent

    编辑

    当然,必须是NSWeekCalendarUnit...

    【讨论】:

    • 我调用我的函数如下: if ([self isFunctionName: [self dateToDateComponents:startDate] and Param:[self dateToDateComponents:currentTripDate]]){ }
    • 有 dateToDateComponents 函数,它使 DateComponents 从日期无符号 unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *dateComponents = [gregorian components:unitFlags fromDate:date]; [格里高利发行];返回日期组件;
    • 所以这是两个日期,我想处理它们。
    • 好的,我明白了,添加了 NSWeekdayCalendarUnit,然后我在 NSLog(@"comp1 week: %@" [comp1 week]) 之后得到了 EXC_BAD_ACCES :S
    • [comp1 week] 返回一个 NSInteger,如果你使用例如NSLog(@"%@", 34), 34 将被取消引用,就好像它是一个会导致错误访问信号的指针。试试 NSLog(@"comp1 week: %i", [comp1 week]);而是
    【解决方案3】:

    从 iOS8 开始,这变得容易多了:

    -(BOOL)isDate:(NSDate *)date1 onSameWeekAs:(NSDate *)date2
    {
        return [[NSCalendar currentCalendar] isDate:date1
                                        equalToDate:date2
                                  toUnitGranularity:NSCalendarUnitWeekOfYear];
    }
    

    来自documentation

    如果两个日期对于所有单位都具有相同的日期部分,则返回 YES 大于或等于给定单位,否则为否。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多