2011-10-05 19 views
38

Estoy intentando generar un NSDate a partir de un mes día y año (todo en formato entero).Generar NSDate a partir del día, mes y año

En este momento mi intento es tal:

NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSDateComponents *components = [[NSDateComponents alloc] init]; 
NSNumber *day = [dataSource valueForKey:@"day"]; 
NSNumber *month = [dataSource valueForKey:@"month"]; 
NSNumber *year = [dataSource valueForKey:@"year"]; 
[components setDay:[day intValue]]; 
[components setMonth:[month intValue]]; 
[components setMonth:[year intValue]]; 
NSDate *_date = [calendar dateFromComponents:components]; 

Sin embargo, _DATE da salida a la siguiente cuando días = 24, mes = 8, año = 2011:

0168-07-25 04:56:02 +0000

Debo estar haciendo algo terriblemente mal, pero no tengo ni idea de qué. Alguien sabe lo que podría estar pasando?

+0

Vine aquí a finales de 2016 y esta cuestión sigue siendo útil. Dado que hay 30 votos útiles sobre esto, votaría para reabrir si es posible. Además, ninguno de los votantes cercanos tiene object-c, iOS, cocoa-touch, cocoa, nsdate en sus etiquetas principales mirando sus perfiles. – matrixugly

Respuesta

38

Usted tiene un error tipográfico en el código: (última línea debe ser setYear:)

[components setDay:[day intValue]]; 
[components setMonth:[month intValue]]; 
[components setYear:[year intValue]]; 
+0

Sí, cuando se dividen las cosas CASI sale bien - No está claro por qué el año es 168 vs 167, o por qué el día es 25 vs 24. Pero el objeto pobre NSDateComponents fue sin duda muy confundido. –

+0

(Probablemente el día haya terminado debido a un error al establecer timeZone en GMT). –

+3

¡Gracias! Definitivamente necesitaba otro par de ojos (u otra taza de café) :) – minimalpop

2

Usted está llamando setMonth dos veces, la segunda vez con el valor por año. En caso de ser:

fallo
[components setDay:[day intValue]]; 
[components setMonth:[month intValue]]; 
[components setYear:[year intValue]]; 
2

Una evidente es:

[components setMonth:[year intValue]]; //setting month with year! 
Cuestiones relacionadas