2 NSDateComponents - ¿es igual semana?
-
01-10-2019 - |
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)
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 NSDate
s 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.