2009-06-29 14 views
12

que estoy tratando de averiguar qué día (es decir, lunes, viernes ...) de una fecha determinada (es decir, 27mo Jun, 2009)¿Cómo encontrar qué día de la semana para una fecha determinada utilizando cacao

Gracias.

+0

Por favor, intente distinguir la diferencia entre Objective-C y Cocoa. Es perfectamente factible usar uno sin el otro, pero en el caso de las fechas, supongo que estás hablando de Cocoa. – dreamlax

+0

Si bien son entidades distintas, es posiblemente más fácil de usar Objective-C sin Cocoa que viceversa. Incluso si usaran Cocoa de Python o lo que sea, las clases y las llamadas a los métodos serían exactamente las mismas. Además, la etiqueta "objetivo-c" no está tan activa como Java o C#, y casi todos los que están viendo esta etiqueta están interesados ​​en la programación de Mac o iPhone. –

+0

¿Has leído la pregunta sin editar? No hizo ninguna referencia a Cocoa, de ahí la edición y el comentario. Creo que es importante hacer la distinción, al igual que las personas con C++ y STL, C# y .NET, etc. – dreamlax

Respuesta

6

Utilice NSCalendar y NSDateComponents. Como se muestra en la documentación de NSDateComponents:

NSCalendar *gregorian = [[NSCalendar alloc] 
initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDate *date = [gregorian dateFromComponents:comps]; 
NSDateComponents *weekdayComponents = [gregorian components:NSWeekdayCalendarUnit fromDate:date]; 
int weekday = [weekdayComponents weekday]; 
+1

¿De dónde viene "comps"? Además, técnicamente @ThisThib es correcto que -weekday devuelve un valor NSInteger. No debería ser un problema para cualquier calendario que conozco, pero en nombre de la corrección y la portabilidad ... ;-) –

16

Puede echarle un vistazo a las clases NSDate y NSCalendar. Por ejemplo, here y here

Proporcionan el siguiente código:

NSDate *today = [NSDate date]; 
NSCalendar *gregorian = [[NSCalendar alloc] 
         initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *weekdayComponents = 
       [gregorian components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:today]; 
NSInteger day = [weekdayComponents day]; 
NSInteger weekday = [weekdayComponents weekday]; 
28

que he estado haciendo:

NSDateFormatter* theDateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[theDateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4]; 
[theDateFormatter setDateFormat:@"EEEE"]; 
NSString *weekDay = [theDateFormatter stringFromDate:[NSDate date]]; 

Esto tiene la ventaja añadida de que le permite elegir la forma en que había como el día laborable que se devolverá (cambiando la cadena de formato de fecha en setDateFormat: call

Muchos más en la formación en:

http://developer.apple.com/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369

-1

Esto es lo que terminó con, que funciona exactamente como se pretende. Se necesita una fecha, altera la fecha para ser el primer día del mes, y se pone el día de esa fecha:

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date]; 
NSDateComponents *monthDateComponents = [[NSCalendar currentCalendar] components: NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear | 
             NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate: date]; 

// build date as start of month 
monthDateComponents.year = components.year; 
monthDateComponents.month = components.month; 
monthDateComponents.day = 1; 

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
// [gregorian setFirstWeekday:1]; 

NSDate *builtDate =[gregorian dateFromComponents: monthDateComponents]; 
// NSDateComponents *weekdayComponents =[gregorian components: NSCalendarUnitWeekday fromDate: builtDate]; 

NSDateFormatter *df = [NSDateFormatter new]; 
[df setDateFormat:@"E"]; 

NSString *firstDay = [df stringFromDate:builtDate]; 
if([firstDay isEqual:@"Sun"]) // do for the other 6 days as appropriate 
    return 7; 
Cuestiones relacionadas