93 votes

Comment vérifier si un NSDate se produit entre deux autres NSDates

J’essaie de comprendre si oui ou non il tombe la date actuelle dans une plage de dates à l’aide de NSDate.

Par exemple, vous pouvez obtenir la date/heure actuelle à l’aide de NSDate :

Ensuite, je voudrais utiliser cette date pour vérifier si c’est de l’ordre de 09:00-17:00.

173voto

Brock Woolf Points 16128

J’ai trouvé une solution. Si vous avez une meilleure solution, n’hésitez pas à le laisser et j’il marquera comme correcte.

13voto

Quinn Taylor Points 29688

Pour la première partie, utilisez la réponse de @kperryua pour construire le NSDate objets que vous souhaitez comparer. De votre réponse à votre propre question, on dirait que vous avez compris.

Pour comparer les dates, je suis totalement d'accord avec @Tim'commenter votre réponse. C'est plus concis encore fait exactement équivalent à celui de votre code, et je vais vous expliquer pourquoi.

+ (BOOL) date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate {
    return (([date compare:beginDate] != NSOrderedAscending) && ([date compare:endDate] != NSOrderedDescending));
}

Bien qu'il puisse sembler que la demande de retour doit évaluer les deux opérandes de l'opérateur&, ce n'est effectivement pas le cas. La clé est "court-circuit d'évaluation", qui est mis en œuvre dans une grande variété de langages de programmation, et certainement dans C. en gros, les opérateurs & et && "court-circuit" si le premier argument est 0 (ou PAS, nul, etc.), alors qu' | et || faire de même si le premier argument n'est pas 0. Si date "vient avant" beginDate, le test renvoie NO , sans même avoir besoin de comparer avec endDate. Fondamentalement, il fait la même chose que votre code, mais dans un rapport simple sur une seule ligne, pas de 5 (ou 7, avec des espaces).

C'est conçu comme une contribution constructive, depuis quand les programmeurs à comprendre la façon dont leur langage de programmation particulier évalue des expressions logiques, ils peuvent construire eux plus efficacement sans pour autant l'efficacité. Cependant, il existe des tests qui permettrait d' être moins efficace, puisque tous les opérateurs de court-circuit. (En effet, la plupart ne peuvent pas court-circuit, comme le numérique, les opérateurs de comparaison.) En cas de doute, il est toujours plus sûr d'être explicite dans la séparation de votre logique, mais le code peut être beaucoup plus lisible lorsque vous laissez la langue/compilateur gérer le peu de choses pour vous.

4voto

kperryua Points 6905

Si vous voulez savoir si la date du jour comprise entre deux compte tenu de points dans le temps (09:00-17:00 le 01/07/09), utilisent NSCalendar et NSDateComponents pour construire des instances NSDate pour le désiré fois et de les comparer avec la date actuelle.

Si vous voulez savoir si la date du jour comprise entre ces deux heures tous les jours, alors vous pourriez aller probablement l’effet inverse. Créez un objet NSDateComponents et NSCalendar et votre NSDate et comparer les composants heure.

4voto

justin Points 72871

Ceci peut être fait facilement à l’aide d’intervalles de temps des dates, comme suit :

-2voto

ikanimo Points 69

Même intérêt... mais si vous voulez inclure endDate juste :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X