Question

Je suis en train de faire quelque chose qui, pour moi, est un peu difficile. Mais je suis sûr que quelqu'un a une idée.

Étant donné une date, disons January 17, 2011, je suis en train de comprendre le jour correspondant à cette date il y a un an. Alors January 17, 2011 est un lundi, et il y a un an, ce jour est tombé sur January 18, 2010 (un lundi aussi). Il se trouve que January 18, 2010 est de 354 jours avant January 17, 2011. Je pensais à l'origine pour soustraire tout simplement 365 jours pour une année bissextile et 366 jours pour une année bissextile, mais si vous le faites dans ce cas, vous obtiendrez January 17, 2010, qui est un dimanche, pas un lundi.

Ainsi, Objective-C avec NSDate et NSCalendar, comment pourrais-je mettre en œuvre une fonction telle que:

-(NSDate *)logicalOneYearAgo:(NSDate *)from {
}

En d'autres termes, le n-ième « semaine » du mois nième (où est le lundi ou le mardi ou le mercredi, etc. « semaine »)

Était-ce utile?

La solution 5

La réponse est avéré être assez simple. Il est avéré d'essais et d'erreurs. Voici la réponse.

si l'année est une année bissextile, il faut soustraire 365 jours.

si l'année est pas une année bissextile, soustrayez 364 jours.

Autres conseils

Vous utilisez NSDateComponents comme ceci:

- (NSDate *)logicalOneYearAgo:(NSDate *)from {

    NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];

    NSDateComponents *offsetComponents = [[[NSDateComponents alloc] init] autorelease];
    [offsetComponents setYear:-1];

    return [gregorian dateByAddingComponents:offsetComponents toDate:from options:0];

}

Ceci est couvert dans la section date et heure de programmation de la section Guide sur les calculs Calendrical, Ajout de composants à une date

Plus précisément, le procédé d'intérêt est dateByAddingComponents : toDate: options

.

En utilisant l'exemple d'Apple comme base, pour soustraire un an à compter de la date actuelle, vous ne procédez comme suit:

NSDate *today = [[NSDate alloc] init];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

/*
  Create a date components to represent the number of years to add to the current date.
  In this case, we add -1 to subtract one year.     
*/

NSDateComponents *addComponents = [[NSDateComponents alloc] init];
addComponents.year = - 1;

return [calendar dateByAddingComponents:addComponents toDate:today options:0];

Je ne peux pas garantir que c'est la façon la plus efficace, mais vous pouvez le faire en utilisant NSCalendar et NSDateComponents. Passez votre instance NSDate en [yourCalendar components:yourComponents fromDate:yourDate], soustraire un an à partir des composants, puis utilisez [yourCalendar dateFromComponents:yourComp].

Désolé pour ne pas fournir le code complet, mais il a été un moment que j'ai travaillé avec ces méthodes, et je ne veux pas vous donner un code qui ne fonctionnera pas.

Soustraire1 année. Puis Soustraire1 jour jusqu'à ce que vous finissez par le même jour de la semaine que vous voulez.

Chaque année, les « jours de la semaine » remonte 1 jour, sauf quand il y a un 29 feb entre les deux, ils remontent 2 jours.

Il est parce qu'une année est de 52 semaines + 1 jour (+2 pour les années bissextiles).

Donc, si vous appliquez indéfiniment cette logique, vous finirez, années après années, ayant un 16 juin à 24 mai.

Si vous ne voulez pas que cela se produise, il faut mémoriser quelque part l'année de référence et la base de votre arithmétique dessus.

Par exemple, si le « nouveau » lundi est de 4 jours en arrière (parce que 3 ans se sont écoulés), vous préférerez peut-être choisir le lundi 3 jours à l'avance dans le temps, afin de ne pas jours indéfiniment Soustraire, années après années.

it helps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top