2 NSDateComponents - 是同一周吗?

Posted

技术标签:

【中文标题】2 NSDateComponents - 是同一周吗?【英文标题】:2 NSDateComponents - is it same week? 【发布时间】: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)

【问题讨论】:

【参考方案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 大于或等于给定单位,否则为否。

【讨论】:

以上是关于2 NSDateComponents - 是同一周吗?的主要内容,如果未能解决你的问题,请参考以下文章

NSDateComponents weekOfYear 返回错误的日期

NSDateFormatter 和 NSDateComponents 为周数返回不同的值

NSDateComponents setWeek - 本周查找

NSDateComponents 不返回日期

objective-c calendar 日历

错误的星期几?