iOS: compara dos fechas

Tengo un NSDate que debo comparar con otros dos NSDate y lo bash con NSOrderAscending y NSOrderDescending pero si mi fecha es igual en otras dos fechas.

Ejemplo: si tengo un myDate = 24/05/2011 y otros dos que son uno = 24/05/2011 y dos 24/05/2011 ¿qué puedo usar?

Según la documentación de Apple de NSDate compare:

Devuelve un valor de NSComparisonResult que indica el orden temporal del receptor y otra fecha determinada.

- (NSComparisonResult)compare:(NSDate *)anotherDate

Parámetros anotherDate

La fecha para comparar el receptor. Este valor no debe ser nulo. Si el valor es nulo, el comportamiento no está definido y puede cambiar en futuras versiones de Mac OS X.

Valor de retorno

Si:

El receptor y otro Fecha son exactamente iguales entre sí, NSOrderedSame

El receptor está más tarde en el tiempo que otro Fecha, NSOrderedDescending

El receptor está más temprano en el tiempo que otro Fecha, NSOrderedAscending

En otras palabras:

 if ([date1 compare:date2] == NSOrderedSame) ... 

Tenga en cuenta que puede ser más fácil en su caso particular leer y escribir esto:

 if ([date2 isEqualToDate:date2]) ... 

Ver la documentación de Apple sobre este .

Después de buscar Stackoverflow y la web mucho, tengo que llegar a la conclusión de que la mejor manera de hacerlo es así:

 - (BOOL)isEndDateIsSmallerThanCurrent:(NSDate *)checkEndDate { NSDate* enddate = checkEndDate; NSDate* currentdate = [NSDate date]; NSTimeInterval distanceBetweenDates = [enddate timeIntervalSinceDate:currentdate]; double secondsInMinute = 60; NSInteger secondsBetweenDates = distanceBetweenDates / secondsInMinute; if (secondsBetweenDates == 0) return YES; else if (secondsBetweenDates < 0) return YES; else return NO; } 

Usted puede cambiarlo a la diferencia entre horas también.

¡Disfrutar!


Editar 1

Si desea comparar la fecha con el formato de dd / MM / aaaa solamente, debe agregar las siguientes líneas entre NSDate* currentdate = [NSDate date]; && NSTimeInterval distance

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"dd/MM/yyyy"]; [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]]; NSString *stringDate = [dateFormatter stringFromDate:[NSDate date]]; currentdate = [dateFormatter dateFromString:stringDate]; 

Supongo que está preguntando cuál es el valor de retorno en la función de comparación.

Si las fechas son iguales, entonces devolver NSOrderedSame

Si asciende (2nd arg> 1st arg) return NSOrderedAscending

Si desciende (2nd arg <1st arg) return NSOrderedDescending

No sé exactamente si ha pedido esto, pero si solo desea comparar el componente de fecha de un NSDate, debe usar NSCalendar y NSDateComponents para eliminar el componente de tiempo.

Algo así debería funcionar como una categoría para NSDate:

 - (NSComparisonResult)compareDateOnly:(NSDate *)otherDate { NSUInteger dateFlags = NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit; NSCalendar *gregorianCalendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; NSDateComponents *selfComponents = [gregorianCalendar components:dateFlags fromDate:self]; NSDate *selfDateOnly = [gregorianCalendar dateFromComponents:selfComponents]; NSDateComponents *otherCompents = [gregorianCalendar components:dateFlags fromDate:otherDate]; NSDate *otherDateOnly = [gregorianCalendar dateFromComponents:otherCompents]; return [selfDateOnly compare:otherDateOnly]; } 

NSDate realidad representa un intervalo de tiempo en segundos desde una fecha de referencia (1 de enero de 2000 UTC, creo). Internamente, se usa un número de coma flotante de precisión doble, por lo que es muy poco probable que dos fechas arbitrarias se igualen, incluso si están en el mismo día. Si quiere ver si una fecha en particular cae en un día en particular, probablemente necesite usar NSDateComponents . p.ej

 NSDateComponents* dateComponents = [[NSDateComponents alloc] init]; [dateComponents setYear: 2011]; [dateComponents setMonth: 5]; [dateComponents setDay: 24]; /* * Construct two dates that bracket the day you are checking. * Use the user's current calendar. I think this takes care of things like daylight saving time. */ NSCalendar* calendar = [NSCalendar currentCalendar]; NSDate* startOfDate = [calendar dateFromComponents: dateComponents]; NSDateComponents* oneDay = [[NSDateComponents alloc] init]; [oneDay setDay: 1]; NSDate* endOfDate = [calendar dateByAddingComponents: oneDay toDate: startOfDate options: 0]; /* * Compare the date with the start of the day and the end of the day. */ NSComparisonResult startCompare = [startOfDate compare: myDate]; NSComparisonResult endCompare = [endOfDate compare: myDate]; if (startCompare != NSOrderedDescending && endCompare == NSOrderedDescending) { // we are on the right date } 

Compruebe la siguiente función para la comparación de fechas primero, cree dos objetos NSDate y pase a la función: Agregue las siguientes líneas de código en viewDidload o según su escenario.

 -(void)testDateComaparFunc{ NSString *getTokon_Time1 = @"2016-05-31 03:19:05 +0000"; NSString *getTokon_Time2 = @"2016-05-31 03:18:05 +0000"; NSDateFormatter *dateFormatter=[NSDateFormatter new]; [dateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss Z"]; NSDate *tokonExpireDate1=[dateFormatter dateFromString:getTokon_Time1]; NSDate *tokonExpireDate2=[dateFormatter dateFromString:getTokon_Time2]; BOOL isTokonValid = [self dateComparision:tokonExpireDate1 andDate2:tokonExpireDate2];} 

aquí está la función

 -(BOOL)dateComparision:(NSDate*)date1 andDate2:(NSDate*)date2{ BOOL isTokonValid; if ([date1 compare:date2] == NSOrderedDescending) { //"date1 is later than date2 isTokonValid = YES; } else if ([date1 compare:date2] == NSOrderedAscending) { //date1 is earlier than date2 isTokonValid = NO; } else { //dates are the same isTokonValid = NO; } return isTokonValid;} 

Simplemente cambie la fecha y pruebe la función anterior 🙂