Cómo comparar dos objetos NSDate en el objective C

Tengo objetos de tipo Fecha …

Entonces quiero compararlos, y he escrito una condición if de la siguiente manera

if(([startDate1 isEqualToDate:[self getDefaultDate]]) || (startDate1 != [ self getDefaultDate] && m_selectedDate >= m_currentDate1 && cycleStopped)) { ///execute some condition } 

Entonces, si estoy en lo cierto o no … en este enfoque?

Una cosa más, ya sea enderezar de esta manera es correcto

 if(dtdate > [m_array objectatIndex:i] { } 

Porque estoy obteniendo un comportamiento aleatorio …

Así que por favor ayúdenme amigos y geeks

Saludos Ranjit

Aquí hay un ejemplo usando el método NSDate , compare:

 if([startDate compare: endDate] == NSOrderedDescending) // if start is later in time than end { // do something } 

De la referencia de clase:

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.

También puede usar el método timeIntervalSinceDate: si quiere comparar dos fechas y encontrar los segundos entre ellas, por ejemplo.

EDITAR:

 if(([startDate1 compare:[self getDefaultDate]] == NSOrderedSame) || ([startDate1 compare: [self getDefaultDate]] != NSOrderedSame && (([m_selectedDate compare: m_currentDate1] == NSOrderedDescending) || [m_selectedDate compare: m_currentDate1] == NSOrderedSame) && cycleStopped)) 

Una forma sencilla de comparar NSDates (que se encuentra aquí http://webd.fr/637-comparer-deux-nsdate ):

 #import  @interface NSDate (Compare) -(BOOL) isLaterThanOrEqualTo:(NSDate*)date; -(BOOL) isEarlierThanOrEqualTo:(NSDate*)date; -(BOOL) isLaterThan:(NSDate*)date; -(BOOL) isEarlierThan:(NSDate*)date; //- (BOOL)isEqualToDate:(NSDate *)date; already part of the NSDate API @end 

Y la implementación:

 #import "NSDate+Compare.h" @implementation NSDate (Compare) -(BOOL) isLaterThanOrEqualTo:(NSDate*)date { return !([self compare:date] == NSOrderedAscending); } -(BOOL) isEarlierThanOrEqualTo:(NSDate*)date { return !([self compare:date] == NSOrderedDescending); } -(BOOL) isLaterThan:(NSDate*)date { return ([self compare:date] == NSOrderedDescending); } -(BOOL) isEarlierThan:(NSDate*)date { return ([self compare:date] == NSOrderedAscending); } @end 

Fácil de usar:

 if([aDateYouWant ToCompare isEarlierThanOrEqualTo:[NSDate date]]) // [NSDate date] is now { // do your thing ... } 

Disfrutar

Debo admitir que encuentro el negocio de “comparar” == NSWhatHaveYou demasiado complicado de recordar (aunque es correcto y funciona). NSDate tiene otros dos métodos que a mi cerebro le resultan mucho más fáciles de manejar: beforeDate y laterDate.

Considera esto:

 if ([myDate laterDate:today] == myDate) { NSLog(@"myDate is LATER than today"); } else { NSLog(@"myDate is EARLIER than today"); } // likewise: if ([myDate earlierDate:today] == myDate) { NSLog(@"myDate is EARLIER than today"); } else { NSLog(@"myDate is LATER than today"); } 

Cualquiera de los métodos devuelve un objeto NSDate, que es anterior o posterior al otro.

http://pinkstone.co.uk/how-to-compare-two-nsdates/

Realmente me gustó la respuesta de Luke, y funcionó a las mil maravillas.

Usé algo como esto:

 If ([enteredDate compare: [NSDate Date]]== NSOrderedSame || NSOrderedDescending) { //Do Something if the enteredDate is later or the same as today }else { //if the enteredDate is before today's date } 

No estoy seguro si eso ayuda, pero solo para reiterar lo que Luke había escrito.

Esta es una manera simple de verificar si la fecha que cree que es más grande (por ejemplo, en el futuro) en comparación con la fecha que cree que es anterior. Esto es lo que hace esto.

  1. Obtiene el intervalo de tiempo (segundos y frac segundos) de fecha actual y futura
  2. devuelve verdadero si la fecha de su prueba es mayor (referencia de tiempo) la otra fecha

Aqui tienes

 - (BOOL)isDateGreaterThanDate:(NSDate*)greaterDate and:(NSDate*)lesserDate{ NSTimeInterval greaterDateInterval = [greaterDate timeIntervalSince1970]; NSTimeInterval lesserDateInterval = [lesserDate timeIntervalSince1970]; if (greaterDateInterval > lesserDateInterval) return YES; return NO; } 

Esto también funciona

 BOOL *isGreaterDateTruelyGreater = [greaterDate timeIntervalSince1970] > [lesserDate timeIntervalSince1970]; 

La forma en que object-c trata las fechas es menos que intuitiva. Básicamente puede usar NSTimeInterval para obtener la cantidad de segundos de un punto en el tiempo. Por lo general, da un número largo, por ejemplo, cuando escribo esto, 1351026414.640865 es el intervalo de tiempo desde 1970.

Punto en el tiempo> punto en el tiempo 1351026415.640865> 1351026414.640865 Lo anterior es 1 segundo más adelante, por lo que es cierto.