Detectar si dos dates están dentro del mismo día calendar.

Mi aplicación presenta una list de posts, cada uno tiene una date de creación.

No quiero solo mostrar la date, sino mostrar diferentes formattings según el time transcurrido desde la date de creación.

Por ejemplo, así es como creo la cadena de date a partir de la date:

NSDate *date = someMessage.creationDate; NSTimeInterval timePassed = [[NSDate date] timeIntervalSinceDate:date]; if (timePassed < 60 ) { // less then one minute return @"now" } else if (timePassed < 3600) { // less then one hour NSInteger minutes = (NSInteger) floor(timePassed / 60.0); return [NSString stringWithFormat:@"%d minutes ago", minutes]; } 

así que ahora quiero agregar los siguientes casos:

 else if ("timePassed < 24 hours ago and within the same calendar day") // do something } else if ("timePassed > 24 hours, or within previous calendar day") { // do something else } 

pero no estoy seguro de cómo hacerlo, se agradecerá cualquier ayuda

Aquí hay una categoría simple en NSDate que agrega methods útiles de comparación de dates:

 #ifndef SecondsPerDay #define SecondsPerDay 86400 #endif @interface NSDate (Additions) /** * This method returns the number of days between this date and the given date. */ - (NSUInteger)daysBetween:(NSDate *)date; /** * This method compares the dates without time components. */ - (NSComparisonResult)timelessCompare:(NSDate *)date; /* * This method returns a new date with the time set to 12:00 AM midnight local time. */ - (NSDate *)dateWithoutTimeComponents; @end @implementation NSDate (Additions) - (NSUInteger)daysBetween:(NSDate *)date { NSDate *dt1 = [self dateWithoutTimeComponents]; NSDate *dt2 = [date dateWithoutTimeComponents]; return ABS([dt1 timeIntervalSinceDate:dt2] / SecondsPerDay); } - (NSComparisonResult)timelessCompare:(NSDate *)date { NSDate *dt1 = [self dateWithoutTimeComponents]; NSDate *dt2 = [date dateWithoutTimeComponents]; return [dt1 compare:dt2]; } - (NSDate *)dateWithoutTimeComponents { NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *components = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:self]; return [calendar dateFromComponents:components]; } @end 

Ejemplo de uso:

 NSDate *currentDate = [NSDate date]; NSDate *distantPastDate = [NSDate distantPast]; NSComparisonResult *result = [currentDate timelessCompare:distantPastDate]; // result will equal NSOrdenetworkingDescending 

¿Necesita saber una diferencia más detallada en el time?

¿Necesita saber la diferencia entre dos dates hasta la segunda? Use timeIntervalSinceDate: que viene de serie en NSDate .

Vas a querer ver esta respuesta .

A saber:

 NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitYear fromDate:yourDate]; NSUInteger year = [components year]; NSUInteger dayOfYear = [[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:yourDate]; 

Compruebe ese atributo day para ambos NSDates, entonces sabrá si estaban en el mismo día calandar. En cuanto a las 24 horas o less / más, puede tomar una date y usar la function timeIntervalSinceDate: y ver si eso es más / less de 86400 (número de segundos en un día).

EDITAR: actualizado para ser un cheque más específico para año y día.