2010-09-01 16 views
3

comment puis-je calculer la semaine calendaire? Un an a 52/53 semaines et il y a deux règles:calculer la semaine civile

-USA

-DIN 1355/ISO 8601

Je voudrais travailler avec DIN 1355/ISO 8601. Comment puis-je gérer cette?

Modifier:

NSDate *today = [NSDate date]; 
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"ww"]; 
NSString *weeknumber = [dateFormat stringFromDate: today]; 
NSLog(@"week: %@", weeknumber); 

Tiré de http://iosdevelopertips.com/cocoa/date-formatter-examples.html

Où puis-je trouver les formats de date autorisés?

+0

Les formats de date sont liés dans la documentation des pommes: http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns –

Répondre

5

Utilisez un NSCalendar et NSDateComponents.

NSCalendar *cal = [NSCalendar currentCalendar]; 
NSDateComponents *components = [cal components:NSWeekCalendarUnit fromDate:date]; 
NSInteger week = [components week]; 
+0

Je devais déclarer NSDate * date = [date NSDate]; Encore un problème reste. Comment puis-je influencer le résultat s'il est 35 ou 36. Etats DIN/ISO la première semaine comprend le 4 janvier. Outlook, par exemple, indique que les 1er, 2 et 3 janvier 2010 (du vendredi au dimanche) sont dans la première semaine (semaine du calendrier américain?).Donc, il y a des différences partout et je veux en conséquence 36 selon Outlook. – testing

+0

Le calendrier est basé sur Locale. Aux États-Unis, il est par défaut au calendrier grégorien. Il semble que Apple planifie la mise en œuvre du calendrier ISO8601, mais ce n'est pas encore fait. Ils ont une clé NSISO8601Calendar pour initialiser NSCalendar, mais la documentation indique qu'elle n'est pas implémentée. – Elfred

+0

Une chose que vous pouvez faire est de vérifier quelle est la semaine du 4 janvier et de modifier la semaine ci-dessus en fonction de cela. – Elfred

0

Vous devez utilisateur NSDateFormatter comme ceci:

NSDateFormatter *fm = [[NSDateFormatter alloc] initWithDateFormat:@"ww" allowNaturalLanguage:NO]; 
NSString *week = [fm stringFromDate: date]; 
+1

Merci pour votre réponse. Votre code est destiné à Mac OS X. Maintenant, j'ai essayé de le faire (voir question éditée), mais j'obtiens 35. Outlook états 36. Le premier janvier est également dans la première semaine dans Outlook. D'où vient la différence? – testing

+0

Peut dépendre du début de la semaine. Aux États-Unis, il est courant de commencer le dimanche par le premier jour de la semaine, en Europe par lundi. Peut-être que les perspectives ne font que style? –

+0

Merci pour le lien vers les formats de date. Après ce que j'ai lu la première semaine du calendrier américain est la semaine qui contient le 1er janvier. Et cette année vendredi était le 1er janvier. Donc ce n'est pas grave si dimanche ou lundi est le premier jour de la semaine dans ce cas. Je ne sais pas ce que Outlook utilise (ce n'est pas l'ISO car la première semaine devrait contenir le 4 janvier). Aussi, je ne sais pas ce que ces classes d'Apple font. Suggestions? J'ai maintenant essayé [cal setFirstWeekday: 2]; et je reçois comme prévu 35. Votre lien posté est conforme après ISO 8601 (donc quatre jours de la nouvelle année devraient être la première semaine) – testing

1

Ou utilisez:

CFAbsoluteTime currentTime = CFAbsoluteTimeGetCurrent(); 
CFTimeZoneRef currentTimeZone = CFTimeZoneCopyDefault();  
SInt32 weekNumber = CFAbsoluteTimeGetWeekOfYear(currentTime, currentTimeZone); 

La numérotation suit la définition ISO 8601 de la semaine.

1
NSDate *today = [NSDate date]; 
NSCalendar *ISO8601 = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierISO8601]; 
ISO8601.firstWeekday = 2; // Sunday = 1, Saturday = 7 
ISO8601.minimumDaysInFirstWeek = 4; 
NSDateComponents *components = [ISO8601 components:NSCalendarUnitWeekOfYear fromDate:today]; 
NSUInteger weekOfYear = [components weekOfYear]; 
NSDate *mondaysDate = nil; 
[ISO8601 rangeOfUnit:NSCalendarUnitYearForWeekOfYear startDate:&mondaysDate interval:NULL forDate:today]; 
NSLog(@"The current Weeknumber of Year %ld ", weekOfYear); 
+0

Cela fonctionne pour les régions ISO8601 telles que l'Europe – Uli2000

+0

Beau travail, et bienvenue dans Stackoverflow! Généralement, un peu plus de texte dans la réponse expliquant le code que vous fournissez est utile. Dans ce cas, au lieu d'un commentaire, vous auriez pu mettre le commentaire que vous avez laissé comme partie de l'explication dans la réponse. –

0

Il existe plusieurs types de Canlendar.

Week number according to the ISO-8601 standard, weeks starting on Monday. The first week of the year is the week that contains that year's first Thursday (='First 4-day week'). The highest week number in a year is either 52 or 53. This year has 52 weeks.This is not the only week numbering system in the world, other systems use weeks starting on Sunday (US) or Saturday (Islamic). 

Plus de détails: http://www.epochconverter.com/weeknumbers

et Apple ne supporte que, pour que vous puissiez trouver correctement aiguillés par https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/

Par exemple, avec ISO-8601 standard:

NSCalendar *ISO8601 = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierISO8601]; 

Hope this pourrait Aidez-moi.