2009-06-29 3 views
12

Я пытаюсь выяснить, какой день (т.е. в понедельник, пятница ...) какой-либо определенной даты (т.е. 27 июня 2009 г.)Как найти то, что день недели для любой даты с использованием какао

Спасибо.

+0

Пожалуйста, попробуйте отличить разницу между Objective-C и какао. Это совершенно возможно использовать один без другого, но в случае дат я предполагаю, что вы говорите о Какао. – dreamlax

+0

Хотя они представляют собой разные сущности, возможно, проще использовать Objective-C без какао, чем наоборот. Даже если они будут использовать Cocoa от Python или что-то еще, вызовы классов и методов будут точно такими же. Кроме того, тег «object-c» не так активен, как Java или C#, и почти все, кто просматривает этот тег, заинтересованы в программировании на Mac или iPhone. –

+0

Вы прочитали неотредактированный вопрос? Он не ссылался на Cocoa, поэтому редактирование и комментарий. Я думаю, что важно сделать различие так же, как люди должны с C++ и STL, C# и .NET и т. Д. – dreamlax

ответ

6

Использование NSCalendar и NSDateComponents. Как показано в документации NSDateComponents:

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

Где находится "comps"? Кроме того, технически @ThisThib правильно, что -weekday возвращает значение NSInteger. Не должно быть проблем для любого календаря, который я знаю, но во имя правильности и переносимости ... ;-) –

16

Вы можете посмотреть на классы NSDate и NSCalendar. Например, here и here

Они обеспечивают следующий код:

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

Я делал:

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

Это дополнительный бонус позволяет вам выбрать, как вы хотите как день недели для возврата (путем изменения строки формата даты в setDateFormat: звонок

Больше всего в формирование у:

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

-1

Вот что я завелся с, который работает точно так же, как предполагалось. Он принимает дату, изменяет дату, чтобы быть первым в месяц, и получает день этой даты:

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;