2010-01-17 4 views

Répondre

72

Essayez ceci:

NSCalendar *gregorian = 
    [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSUInteger dayOfYear = 
    [gregorian ordinalityOfUnit:NSDayCalendarUnit 
    inUnit:NSYearCalendarUnit forDate:[NSDate date]]; 
[gregorian release]; 
return dayOfYear; 

date est la date que vous souhaitez déterminer le jour de l'année. La documentation de la méthode NSCalendar.ordinalityOfUnit est here.

+0

wow, cela pourrait simplifier les choses, c'est presque une réponse à mon autre question, http://stackoverflow.com/questions/2078372/ Propably un meilleur :) – Godisemo

-2

Avec la classe NSDate. Utilisez le message timeIntervalSinceDate. Il vous retournera une valeur NSTimeInterval (en fait c'est un double) qui représente les secondes écoulées depuis la date que vous voulez. Après cela, il est facile de convertir les secondes en jours. Si vous tronquez seconds/86400 vous donnera des jours.

Disons que vous voulez jours depuis le 1er Janvier 2010.

// current date/time 
NSDate *now = [[NSData alloc] init]; 

// seconds elapsed since January 1st 2010 00:00:00 (GMT -4) until now 
NSInteval interval = [now timeIntervalSinceDate: [NSDate dateWithString:@"2010-01-01 00:00:00 -0400"]]; 

// days since January 1st 2010 00:00:00 (GMT -4) until now 
int days = (int)interval/86400; 
+0

Ne pas oublier d'ajouter un, comme la valeur que vous obtenez est base zéro. – Guffa

+1

Le problème est que vous devrez tester l'année pour chaque date avant de pouvoir calculer. Vous ne voulez pas que le 1er janvier 2011 soit le 366ème jour de l'année – Godisemo

+0

Comme Godisemo le dit, vous ne pouvez pas compter sur de grandes constantes pour déterminer les jours. Qu'en est-il des secondes intercalaires aussi? Ou des années étranges dans le passé lointain manquant des semaines entières de jours? –

6

donc la solution que je suis venu avec est assez propre et simple et en aucune façon compliquée.

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"D"]; 
NSUInteger dayOfYear = [[formatter stringFromDate:[NSDate date]] intValue]; 
[formatter release]; 
return dayOfYear; 

L'astuce ici que j'ai passé si longtemps à comprendre était d'utiliser le NSDateFormatter. Le "D" est le drapeau du jour de l'année.

J'espère que cela a été utile pour vous qui avez le même problème que moi.

+0

Une solution soignée, mais pas la plus pure. ;) Je pense que vous avez été un peu bloqué en pensant aux dates en unités d'années, de mois et de jours au lieu d'une ligne de temps continue. Les dates sont souvent stockées en tant que secondes écoulées (ou jours ou millisecondes ou 1/10000000 secondes) à partir d'une date fixe, un format qui facilite la différence entre le début de l'année et la date spécifique. – Guffa

+0

vrai, c'est la chose difficile à résoudre des problèmes. Vous êtes coincé dans une approche et ne pouvez pas penser à des alternatives. Merci – Godisemo

+0

Comment est-ce que j'utilise cette méthode pour obtenir le jour islamique de l'année? –

2

utilisant ARC et le remplacement des symboles dépréciés, la réponse de John Feminella ressemblerait à ceci:

NSCalendar *greg = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; 
NSUInteger dayOfYear= [greg ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:[NSDate date]]; 
Questions connexes