سؤال

لقد حصلت على وظيفة مع قيمة إرجاع منطقي ومعلمات الإدخال 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]]){ }

وخلال اختباري ، فإنه يعيد نعم جميع تواريخاتي (على سبيل المثال 2010.07.21 - 2010.08.18)

هل كانت مفيدة؟

المحلول

تنص مرجع فئة 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

نصائح أخرى

هذا مستوحى من إجابة روبرت. لقد قمت بتعديل الأمر قليلاً لمعالجة المشكلة عندما يعبر أسبوع عامين ، على سبيل المثال 12/31/2012 و 1/1/2013.

- (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 ، أصبح هذا أسهل بكثير:

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

من توثيق:

إرجاع نعم إذا كان لكل من التواريخ مكون تاريخ متساو لجميع الوحدات أكبر من أو تساوي الوحدة المحددة ، وإلا لا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top