2009-06-29 6 views
12

Sto cercando di capire quale giorno (cioè Lunedi, Venerdì ...) di qualsiasi data (cioè 27 giugno 2009)Come trovare ciò che giorno della settimana per qualsiasi data utilizzando cacao

Grazie.

+0

Prova a distinguere la differenza tra Objective-C e Cocoa. È perfettamente fattibile usarne uno senza l'altro, ma nel caso delle date presumo tu stia parlando di Cocoa. – dreamlax

+0

Mentre sono entità distinte, è probabilmente più facile usare Objective-C senza Cocoa che viceversa. Anche se dovessero usare Cocoa da Python o altro, le chiamate di classi e metodi sarebbero esattamente le stesse. Inoltre, il tag "oggettivo-c" non è così attivo come Java o C# e praticamente chiunque stia visualizzando questo tag è interessato alla programmazione per Mac o iPhone. –

+0

Hai letto la domanda inedita? Non ha fatto alcun riferimento a Cocoa, quindi la modifica e il commento. Penso che sia importante fare la distinzione, proprio come dovrebbero le persone con C++ e STL, C# e .NET, ecc. – dreamlax

risposta

6

Utilizzare NSCalendar e NSDateComponents. Come mostrato nella documentazione NSDateComponents:

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

Da dove provengono i "comps"? Inoltre, tecnicamente @ThisThib è corretto che -weekday restituisce un valore NSInteger. Non dovrebbe essere un problema per nessun calendario che conosco, ma in nome della correttezza e della portabilità ... ;-) –

16

Si può avere uno sguardo alle classi NSDate e NSCalendar. Per esempio, here e here

Essi forniscono il seguente codice:

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

ho fatto:

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

Questo ha il vantaggio di lasciare che si sceglie come si sarebbe come il giorno della settimana da restituire (cambiando la stringa del formato della data nel setDateFormat: chiama

Molto altro in formazione a:

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

-1

Ecco cosa ho liquidata con, che funziona esattamente come previsto. Ci vuole una data, altera la data di essere il primo del mese, e ottiene il giorni di tale data:

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;