2009-06-29 9 views
12

Próbuję dowiedzieć się co dzień (tj poniedziałek, piątek ...) z danym terminie (tj cze 27th, 2009)Jak znaleźć co dzień tygodnia dla danej daty użyciem kakao

Dziękuję Ci.

+0

Spróbuj odróżnić różnicę między Objective-C i Cocoa. Jest całkowicie możliwe używanie jednego bez drugiego, ale w przypadku dat zakładam, że mówisz o kakao. – dreamlax

+0

Chociaż są to odrębne byty, prawdopodobnie łatwiej jest używać Objective-C bez kakao niż na odwrót. Nawet gdyby użyli Cocoa z Python lub cokolwiek innego, klasy i wywołania metod byłyby dokładnie takie same. Ponadto znacznik "object-c" nie jest tak blisko, jak Java czy C#, i prawie każdy, kto ogląda ten tag, jest zainteresowany programowaniem na Maca lub iPhonie. –

+0

Czy przeczytałeś niezatwierdzone pytanie? Nie odnosiło się to do kakao, stąd edycja i komentarz. Myślę, że ważne jest, aby odróżnić, tak jak ludzie powinni z C++ i STL, C# i .NET, itp. – dreamlax

Odpowiedz

6

Użyj NSCalendar i NSDateComponents. Jak pokazano w dokumentacji NSDateComponents:

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

Skąd się bierze "comps"? Również technicznie @ThisThib ma rację, że -dzień tygodnia zwraca wartość NSInteger. Nie powinien stanowić problemu dla żadnego kalendarza, jaki znam, ale w imię poprawności i przenośności ... ;-) –

16

Możesz zajrzeć do klas NSDate i NSCalendar. Na przykład here i here

Zapewniają one następujący kod:

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

Robiłem:

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

To dodatkowy bonus pozwalając wybrać sposób, że podobnie jak dzień powracający do poprzedniego dnia (zmieniając ciąg formatu daty w setDateFormat: zadzwoń

Dużo więcej w formacja pod adresem:

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

-1

Oto co z likwidacji, który działa dokładnie tak, jak zamierzał. Zajmuje datę, zmienia datę do pierwszego dnia miesiąca, a dostaje dni od tej daty:

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; 
Powiązane problemy