7
votes

Obtenez un tableau de futurs nsdates

J'ai un sélecteur de date.

Après avoir choisi une fois de ceci, j'aimerais obtenir les dates des 64 prochains lundis.

Comment irais-je écrire une méthode pour prendre une date et renvoyer un nsarray de Nsdates pour les 64 lunds suivants de cette date

pour par exemple J'ai choisi le temps 18:45 à partir du sélecteur de date, puis je veux chercher les 64 lunds suivants avec le temps passé à cette époque.


3 commentaires

Pour le compte rendu, je suis en désaccord avec les votes rapprochés.


Oui ... c'est une question décemment stimulante; Ayaz, quand vous dites que vous voulez "aller chercher" les 64 lundis suivants, dans quelle forme voulez-vous faire la récupération? Nsdates ou ekevents ou?


Je suis d'accord avec Dave (et je suis généralement dur). J'ai essayé de modifier cela pour être un peu plus clair. Je suppose que la restriction de 64 est basée sur la création d'uilocalnotifications. Ainsi, des solutions avec des notifications répétées pourraient également être utiles.


3 Réponses :


1
votes

Vous pouvez utiliser NSCalendar pour déterminer quel jour de la semaine aujourd'hui (à l'heure choisie) est; Bumbriolez-le pour aller au lundi prochain, puis cognez qu'à 7 jours 63 fois pour obtenir le lundi que vous semblez vouloir.


0 commentaires

2
votes

Démarrer avec le nsdate dans le sélecteur et continue d'ajouter 24 * 60 * 60 secondes jusqu'à ce qu'il s'agisse de lundi. Ajouter la date obtenue au résultat. Continuez à ajouter 7 * 24 * 60 * 60 secondes à la dernière date que vous avez ajoutée et poussez le résultat sur la liste de retour jusqu'à ce que vous ayez tous les 64 lundis. Voici comment vous dites si un nsdate chute lundi: xxx

EDIT: Davedelong a souligné une carence dans l'algorithme ci-dessus: il déplacera le temps deux fois sur les jours de passage à l'heure d'épargne du jour. Au lieu de compter les secondes manuellement, utilisez ce code pour ajouter une journée à nsdate : xxx


4 commentaires

Non Non Non Non Non Non Ceci ne compte pas pour l'heure d'épargne du jour! Et le questionneur a clairement dit qu'il veut garder la même heure.


@Davedelong C'est quelque peu en discussion si Apple connaît la journée d'économie de jour à en juger par les performances passées. :-)


@Davedelong Cela devrait être réparé maintenant. Merci!


@Davedelong c'est correct, et c'est l'intention. Le code ajoute un composant qui représente "une journée" à CouranteDate dans l'appel à DateByaddingComponents . Il doit être dans une boucle à la recherche du lundi prochain.



3
votes

Exemple (Arc):

NSDate *pickerDate = [NSDate date];
NSLog(@"pickerDate: %@", pickerDate);

NSDateComponents *dateComponents;
NSCalendar *calendar = [NSCalendar currentCalendar];

dateComponents = [calendar components:NSWeekdayCalendarUnit fromDate:pickerDate];
NSInteger firstMondayOrdinal = 9 - [dateComponents weekday];
dateComponents = [[NSDateComponents alloc] init];
[dateComponents setDay:firstMondayOrdinal];
NSDate *firstMondayDate = [calendar dateByAddingComponents:dateComponents toDate:pickerDate options:0];

dateComponents = [[NSDateComponents alloc] init];
[dateComponents setWeek:1];

for (int i=0; i<64; i++) {
    [dateComponents setWeek:i];
    NSDate *mondayDate = [calendar dateByAddingComponents:dateComponents toDate:firstMondayDate options:0];
    NSLog(@"week#: %i, mondayDate: %@", i, mondayDate);
}


4 commentaires

Merci pour la réponse claire. c'est les 4 prochains lundis. Devrais-je juste boucler à travers elle 63 fois au lieu de 4?


Je viens de montrer les quatre premiers, j'ai édité de la rendre plus claire.


Juste curieux, où avez-vous obtenu 9 pour calculer firstMondayAndinal ?


Les jours sont numérotés à partir de 1 pour le dimanche au lundi, 2 + 7 pendant des jours de semaine = 9.