J'essaie de déterminer si la date actuelle tombe ou non dans une plage de dates en utilisant NSDate.
Par exemple, vous pouvez obtenir la date / heure actuelle à l'aide de NSDate:
NSDate rightNow = [NSDate date];
Je voudrais alors utiliser cette date pour vérifier si elle est comprise entre 9 h et 17 h .
objective-c
cocoa
cocoa-touch
datetime
nsdate
Brock Woolf
la source
la source
Réponses:
J'ai trouvé une solution. Si vous avez une meilleure solution, n'hésitez pas à la laisser et je la marquerai comme correcte.
la source
- (BOOL)isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate;
return !([date compare:startDate] == NSOrderedAscending || [date compare:endDate] == NSOrderedDescending);
Pour la première partie, utilisez la réponse de @kperryua pour construire les objets NSDate avec lesquels vous souhaitez comparer. D'après votre réponse à votre propre question, il semble que vous ayez compris cela.
Pour comparer les dates, je suis totalement d'accord avec le commentaire de @Tim sur votre réponse. C'est plus concis mais en fait exactement équivalent à votre code, et je vais vous expliquer pourquoi.
Bien qu'il puisse sembler que l'instruction return doive évaluer les deux opérandes de l'opérateur &&, ce n'est en fait pas le cas. La clé est "l' évaluation de court-circuit ", qui est implémentée dans une grande variété de langages de programmation, et certainement en C. Fondamentalement, les opérateurs
&
et&&
"court-circuit" si le premier argument est 0 (ou NON, nul, etc.) , tandis que|
et||
faites de même si le premier argument n'est pas 0. Sidate
vient avantbeginDate
, le test retourneNO
sans même avoir besoin de comparer avecendDate
. Fondamentalement, il fait la même chose que votre code, mais en une seule instruction sur une ligne, pas 5 (ou 7, avec un espace).Ceci est conçu comme une entrée constructive, car lorsque les programmeurs comprennent la façon dont leur langage de programmation particulier évalue les expressions logiques, ils peuvent les construire plus efficacement sans trop d'efficience. Cependant, il existe des tests similaires qui seraient moins efficaces, car tous les opérateurs ne court-circuitent pas. (En effet, la plupart ne peuvent pas court-circuiter, comme les opérateurs de comparaison numérique.) En cas de doute, il est toujours prudent d'être explicite en décomposant votre logique, mais le code peut être beaucoup plus lisible lorsque vous laissez le langage / compilateur gérer les petites choses pour vous.
la source
Version Brock Woolf dans Swift:
la source
Si vous voulez savoir si la date actuelle se situe entre deux moments donnés (9 h 00 - 17 h 00 le 01/07/09), utilisez NSCalendar et NSDateComponents pour créer des instances NSDate aux heures souhaitées et les comparer avec la date actuelle.
Si vous voulez savoir si la date actuelle se situe entre ces deux heures chaque jour, vous pourriez probablement aller dans l'autre sens. Créez un objet NSDateComponents avec et NSCalendar et votre NSDate et comparez les composants d'heure.
la source
Si vous pouvez cibler iOS 10.0 + / macOS 10.12+, utilisez la
DateInterval
classe.Tout d'abord, créez un intervalle de dates avec une date de début et de fin:
Ensuite, vérifiez si la date est dans l'intervalle en utilisant la
contains
méthode deDateInterval
:la source
Cela peut être accompli facilement en utilisant les intervalles de temps des dates, comme ceci:
la source
Poursuivre avec les solutions de Quinn et Brock, il est très agréable de sous-classer l'implémentation de NSDate, donc il peut être utilisé partout comme ceci:
Et à n'importe quelle partie de votre code, vous pouvez l'utiliser comme:
(myNSDate, thisNSDate et thatNSDate sont bien sûr NSDates :)
la source
Il existe une solution meilleure et plus rapide à ce problème.
Ensuite, vous pouvez l'appeler comme ça.
Même vous pouvez passer la date au hasard car cette extension vérifie laquelle est minimale et laquelle ne l'est pas.
vous pouvez l'utiliser dans swift 3 et au-dessus.
la source
Avec Swift 5, vous pouvez utiliser l'une des deux solutions ci-dessous afin de vérifier si une date survient entre deux autres dates.
#1. Utilisation de
DateInterval
lacontains(_:)
méthode deDateInterval
a une méthode appeléecontains(_:)
.contains(_:)
a la déclaration suivante:Le code Playground suivant montre comment utiliser
contains(_:)
pour vérifier si une date se produit entre deux autres dates:# 2. Utilisation de
ClosedRange
lacontains(_:)
méthode deClosedRange
a une méthode appeléecontains(_:)
.contains(_:)
a la déclaration suivante:Le code Playground suivant montre comment utiliser
contains(_:)
pour vérifier si une date se produit entre deux autres dates:la source
Une meilleure version dans Swift:
la source