Pregunta

Tengo una función con valor de retorno BOOL y 2 de entrada (NSDateComponents *) parámetros. Mi problema es que tengo dos valores NSDateComponents y yo quiero saber si la caída de dos fecha dentro de la misma semana del calendario. He intentado las soluciones más simples para resolver el problema, mi idea era la siguiente:

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

pero no es correcto. ¿De qué manera puedo solucionarlo?


Editado

Así que tengo una función que hace que datecomponents de fechas.

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

y lo llamo de esta manera:

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

y durante mi prueba devuelve SÍ todas las fechas (por ejemplo 2010.07.21 - 2010.08.18)

¿Fue útil?

Solución

El NSDateComponent estados de referencia de clase:

  

Importante: Un objeto NSDateComponents tiene sentido en sí mismo; tú   necesidad de saber lo que es el calendario   interpretado en contra, y necesita   saber si los valores son absolutos   valores de las unidades, o las cantidades de   las unidades.

¿Qué hay de NSDates comparando su lugar?

- (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];
}

editar : En esta línea:

 unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;

no pasa NSWeekCalendarUnit, por lo tanto, vuelve [dateComponent week] NSUndefinedDateComponent

editar

Por supuesto, tiene que ser NSWeekCalendarUnit ...

Otros consejos

Esto es inspirada por la respuesta de Robert. Me pellizqué un poco para abordar la cuestión cuando se cruza una semana dos años, por ejemplo, 12/31/2012 y 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] );
}

A partir de iOS8, esto se convirtió en mucho más fácil:

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

En la documentación :

  

se vuelve positivo si ambas fechas tienen componente de fecha igual para todas las unidades   mayor que o igual a la unidad dada, de lo contrario NO.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top