2012-04-26 1 views
0

J'ai un objet Person. et cet objet personne a les attributs suivants:Vérification de la date entre une plage de dates - Problème logique - BEGINNER

Name 
StartDate 
EndDate 

Je sauve cet objet Person à un tableau. Ce tableau peut contenir plus de 100 objets personnels. Tous les attributs ci-dessus sont des chaînes.

Voici un exemple d'objets de personne dans ce tableau.

John, Tue Feb 22, Thr Mar 30 
Jack, Wed Mar 09, Fri Apr 21 
Jack, Thu Mar 19, Fri Dec 20 
Jack, Tue Jan 08, Fri Apr 26 etc.. 

Maintenant je dois fournira une date, disons par exemple Wed 29 Mar, et je dois vérifier si elle est dans la gamme de StartDate et EndDate dans le tableau des personnes objet. J'ai un pseudo-code pour le scénario.

La date que je vais vérifier par rapport aux StartDate et EndDate sont aussi des chaînes.

Pseudo-code:

if Startdate >= providedDate && EndDate <= providedDate { 

// Add to an Array 


else 

//Do not add to an array 

Depuis, le StartData, EndDate et ProvidedDate sont toutes les chaînes comment puis-je vérifier si son supérieur ou inférieur à la date prévue?

Note: Il me faut une approche qui n'utilise pas NSPredicate

+0

Qu'est-ce qui ne va pas avec 'NSPredicate'?(Je ne pose pas cette question parce que je pense que vous * devriez * l'utiliser, c'est juste que cela ressemble à une curieuse restriction.) –

+0

Vous devrez analyser les chaînes de date pour les transformer en quelque chose qui peut raisonnablement être comparé. NSDateFormatter est probablement l'outil à utiliser pour cela. –

+0

J'ai essayé NSPredicates, et cela n'a pas fonctionné pour moi. http://stackoverflow.com/questions/10307902/writing-a-simple-nspredicate-logic-issue/10314802#10314802. Par conséquent, j'essaie cette approche qui semble prometteuse. – shajem

Répondre

1

Pour Pour comparer les valeurs, vous avez besoin de valeurs comparables. Vous pouvez utiliser des objets NSDate, vous pouvez lancer des dates sous forme de caractères/chiffres pouvant être triés (par ex. 20120425), ou vous pouvez utiliser des objets personnalisés qui implémentent leurs propres méthodes compare:options:.

Ou vous pouvez écrire une méthode séparée compareString:string1 toString:string2 et utiliser les chaînes comme vous les avez.

Vous avez juste à vous décider que vous voulez faire.

1

Qu'est-ce que vous être testé ici? Il serait étrange d'avoir une date stockée sous forme de chaîne. Êtes-vous censé analyser les dates de la chaîne afin de les comparer à la date fournie? Si c'est le cas, je resterai à l'écart de toutes sortes de classes de dates.

Si oui, je le diviserais en 3 chaînes - jour de la semaine, mois, jour. Vous ne vous souciez pas du jour de la semaine. Vous n'avez pas une année donc vous ne pouvez pas faire de logique à ce sujet ... Je suppose que je suppose que tout est dans la même année. (Vous pourriez faire quelque chose de fou comme calculer «quelle année récente a tombé ce jour-là sur ce jour de la semaine», mais allez ...)

Associez chaque mois avec un nombre entier. Disons, en utilisant une carte de hachage. Comme dans Months.put ('January', 1), etc.

Extraire le nombre de chaque date - convertir juste d'une chaîne en un nombre entier.

alors la logique de savoir si quelque chose est avant ou après une date est (-1 si monMois est avant, 0 est qu'ils sont les mêmes, et 1 est monMois après)

if (Months.get(myMonth) < Months.get(providedMonth)) return -1 
else if (Months.get(myMonth) > Months.get(providedMonth)) return 1 
else 
    if (myDate < providedDate) return -1; 
    else if (myDate > providedDate) return 1; 
    else return 0; 
+0

Je pensais qu'il y aurait un moyen facile de faire ceci: S – shajem

Questions connexes