2009-06-29 7 views
12

J'essaie de comprendre ce jour (soit le lundi, vendredi ...) à une date donnée (à savoir le 27 juin 2009)Comment trouver quel jour de la semaine pour une date donnée en utilisant Cocoa

Je vous remercie.

+0

S'il vous plaît essayer de distinguer la différence entre Objective-C et Cocoa. Il est parfaitement possible d'utiliser l'un sans l'autre, mais dans le cas des dates je suppose que vous parlez de cacao. – dreamlax

+0

Bien qu'ils soient des entités distinctes, il est sans doute plus facile d'utiliser Objective-C sans Cocoa que vice-versa. Même s'ils utilisaient Cocoa de Python ou autre, les appels de classes et de méthodes seraient exactement les mêmes. En outre, la balise "objectif-c" n'est pas aussi active que Java ou C#, et à peu près tout le monde qui regarde cette balise est intéressé par la programmation Mac ou iPhone. –

+0

Avez-vous lu la question non éditée? Il n'a fait aucune référence à Cocoa, d'où l'édition et le commentaire. Je pense qu'il est important de faire la distinction, tout comme les gens devraient avec C++ et STL, C# et .NET, etc – dreamlax

Répondre

6

Utilisez NSCalendar et NSDateComponents. Comme le montre la documentation NSDateComponents:

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

D'où vient "comps"? En outre, techniquement @ThisThib est correct que -weekday renvoie une valeur NSInteger. Cela ne devrait pas poser de problème pour tout calendrier que je connais, mais au nom de la correction et de la portabilité ... ;-) –

16

Vous pouvez avoir un regard aux classes NSDate et NSCalendar. Par exemple, here et here

Ils fournissent le code suivant:

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

J'ai fait:

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

Cela a l'avantage de vous permettre de choisir comment vous comme le jour de la semaine à retourner (en changeant la chaîne de format de la date dans le setDateFormat: appel

Beaucoup plus dans formation à:

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

-1

Voici ce que je blesse avec, qui fonctionne exactement comme prévu. Il faut une date, modifie la date d'être le premier du mois, et obtient le jours cette date:

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; 
Questions connexes