0

我有一个带有 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)

4

3 回答 3

2

这受到罗伯特的回答的启发。当一周超过两年时,我对其进行了一些调整以解决该问题,例如 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] );
}
于 2013-01-07T22:26:10.893 回答
1

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……</p>

于 2010-08-25T14:14:00.643 回答
0

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

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

文档中:

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

于 2016-02-12T01:13:48.547 回答