¿Cómo se calcula el día del año para una fecha específica en Objective-C?

Esto es algo que me encontré pasando horas para descubrir y, por lo tanto, quiero compartir con ustedes.

La pregunta era: ¿cómo determino el día del año para una fecha específica?

por ejemplo, el 15 de enero es el día 15 y el 31 de diciembre es el día 365 cuando no es un año bisiesto.

Prueba esto:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSUInteger dayOfYear = [gregorian ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:[NSDate date]]; [gregorian release]; return dayOfYear; 

donde la date es la fecha para la que desea determinar el día del año. La documentación sobre el método NSCalendar.ordinalityOfUnit está aquí .

Así que la solución que se me ocurrió es bastante clara y simple y no de ninguna manera complicada.

 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"D"]; NSUInteger dayOfYear = [[formatter stringFromDate:[NSDate date]] intValue]; [formatter release]; return dayOfYear; 

El truco aquí que pasé tanto tiempo descifrando fue usar NSDateFormatter. La “D” es la bandera del día del año.

Espero que esto haya sido útil para ustedes que tienen el mismo problema que yo.

Usando ARC y reemplazando símbolos en desuso, la respuesta de John Feminella sería así:

 NSCalendar *greg = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; NSUInteger dayOfYear= [greg ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:[NSDate date]]; 

Con la clase NSDate . Use el mensaje timeIntervalSinceDate . Le devolverá un valor NSTimeInterval (en realidad es un doble) que representa los segundos transcurridos desde la fecha que desea. Después de eso, es fácil convertir segundos a días.

Si truncas seconds/86400 te darán días.

Digamos que quieres días desde el 1 de enero de 2010.

 // current date/time NSDate *now = [[NSData alloc] init]; // seconds elapsed since January 1st 2010 00:00:00 (GMT -4) until now NSInteval interval = [now timeIntervalSinceDate: [NSDate dateWithString:@"2010-01-01 00:00:00 -0400"]]; // days since January 1st 2010 00:00:00 (GMT -4) until now int days = (int)interval/86400;