2011-12-09 17 views
7

Tengo un selector de fecha.Obtener una matriz de futuros NSDates

Después de elegir un momento de esto me gustaría obtener las fechas de los próximos 64 Lunes.

¿Cómo hago para escribir un método para tomar una fecha y devolver una NSArray de NSDates para los próximos 64 lunes de esa fecha

por ejemplo, Escogí la hora a las 6:45 pm del selector de fecha y luego quiero buscar los próximos 64 lunes con el tiempo establecido en ese momento.

+8

Para que conste, no estoy de acuerdo con las estrechas votos. –

+0

sí ... esta es una pregunta bastante desafiante; Ayaz, cuando dices que quieres "buscar" los próximos 64 Lunes, ¿de qué forma quieres hacer la búsqueda? NSDates o EKEvents o? –

+0

Quiero NSDates ... –

Respuesta

3

Ejemplo (ARC):

NSDate *pickerDate = [NSDate date]; 
NSLog(@"pickerDate: %@", pickerDate); 

NSDateComponents *dateComponents; 
NSCalendar *calendar = [NSCalendar currentCalendar]; 

dateComponents = [calendar components:NSWeekdayCalendarUnit fromDate:pickerDate]; 
NSInteger firstMondayOrdinal = 9 - [dateComponents weekday]; 
dateComponents = [[NSDateComponents alloc] init]; 
[dateComponents setDay:firstMondayOrdinal]; 
NSDate *firstMondayDate = [calendar dateByAddingComponents:dateComponents toDate:pickerDate options:0]; 

dateComponents = [[NSDateComponents alloc] init]; 
[dateComponents setWeek:1]; 

for (int i=0; i<64; i++) { 
    [dateComponents setWeek:i]; 
    NSDate *mondayDate = [calendar dateByAddingComponents:dateComponents toDate:firstMondayDate options:0]; 
    NSLog(@"week#: %i, mondayDate: %@", i, mondayDate); 
} 

NSLog salida:
pickerDate: 2011-12-09 20:38 : 25 0000
semana #: 0, mondayDate: 2011-12-12 20:38:25 +0000
semana #: 1, mondayDate: 2011-12-19 20:38:25 +0000
semanas # : 2, lunesFecha: 2011-12-26 20:38:25 +0000
semana #: 3, mondayDate: 2012-01-02 20:38:25 +0000
-el restante 60 aquí-

+0

Gracias por la respuesta clara. eso es los próximos 4 lunes. ¿Debería recorrerlo 63 veces en lugar de 4? –

+0

Solo muestro las primeras cuatro, las he editado para que quede más claro. – zaph

+1

Simplemente curioso, ¿de dónde sacaste '9' para calcular' firstMondayOrdinal'? –

1

Puede usar NSCalendar para determinar qué día de la semana es hoy (en el momento elegido); aumenta el tiempo para llegar al próximo lunes, y luego hazlo por 7 días 63 veces para obtener los lunes que pareces querer.

2

Comience con el NSDate desde el selector, y siga agregando 24 * 60 * 60 segundos hasta que sea un lunes. Agregue la fecha resultante al resultado. Continúe agregando 7 * 24 * 60 * 60 segundos a la última fecha que agregó y presione el resultado en la lista de resultados hasta que tenga todos los 64 lunes. Aquí es cómo saber si un NSDate cae el lunes:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *weekdayComponents =[gregorian components:NSWeekdayCalendarUnit fromDate:dateOfInterest]; 
NSInteger weekday = [weekdayComponents weekday]; 
if (weekday == 2) ... // 2 represents Monday 

EDIT: DaveDeLong señaló una deficiencia en el algoritmo anterior: va a cambiar el tiempo de dos veces en los días de cambio al horario de verano. En lugar de contar segundos manualmente, utilizar este código para añadir un día a NSDate:

NSDate *currentDate = [NSDate date]; 
NSDateComponents *comps = [[NSDateComponents alloc] init]; 
[comps setDay:1]; // Add 1 when searching for the next Monday; add 7 when iterating 63 times 
NSDate *date = [gregorian dateByAddingComponents:comps toDate:currentDate options:0]; 
[comps release]; 
+2

NO NO NO NO NO esto no cuenta para el horario de verano! Y el interrogador dijo claramente que quiere mantener el mismo tiempo. –

+0

@DaveDeLong ¡Buena captura! arreglando ... – dasblinkenlight

+1

@DaveDeLong Es algo discutible si Apple conoce el horario de verano a juzgar por el rendimiento pasado. :-) – zaph