2009-06-04 5 views
0

J'ai un NSTimeInterval, et j'aimerais savoir si cet horodatage se situe entre le début et la fin d'une date. Fondamentalement, je dois pouvoir faire quelque chose comme:Comment déterminer si un NSTimeInterval s'est produit pendant un NSDate arbitraire?

NSDate *today = [NSDate date]; 
NSTimeInterval myInterval = someInterval; 

[date returnYesIfFallsThisDate:myInterval]; 

Y at-il une méthode avant droit de savoir si mon NSTimeInterval tombe le jour même comme un objet NSDate?

Merci à tous.

Répondre

1

Un NSTimeInterval est juste un nombre de secondes. Pour le comparer à un NSDate, vous devez interpréter l'intervalle de temps relatif à un point de référence, puis créer un NSDate avec le résultat, puis comparer les deux NSDates.

Il existe deux dates de référence standard: 2001-01-01 et 1970-01-01 (cette dernière étant "heure UNIX"). Si aucune n'est la date de référence correcte, utilisez NSCalendar pour créer un NSDate pour la date de référence correcte, puis create your NSDate of interest relative to that.

Maintenant pour la comparaison. Si tout ce qui vous intéresse est la date sur le calendrier, alors vous allez créer le NSDate, puis utiliser un NSCalendar pour obtenir NSDateComponents pour la date. Plus précisément, vous obtiendrez l'année, le mois et le jour du mois, puis comparez-les.

Il n'est pas nécessaire de s'inquiéter des heures de "début" et de "fin"; en fait, si vous ne vous souciez que de la date sur le calendrier, vous pouvez ignorer complètement l'heure du jour.

+0

le point de Peter semble valide. Je retire ma réponse si les gens sont d'accord qu'il est préférable d'utiliser NSCalendar pour faire ce genre de comparaison de ce jour, au lieu d'essayer de l'interpréter sur les propres comme je l'ai suggéré. – danielpunkass

+0

Hey Peter, votre message est très utile. Merci encore d'avoir partagé votre sagesse. Daniel, votre poste a été utile aussi bien pour d'autres questions que je traite qui sont sensibles au temps, donc merci. Le message de Peter aborde directement le sujet en question. Merci les amis. –

1

Conceptuellement, vous voulez deux dates qui constituent le «début» et la «fin» de la date cible en question. Ensuite, vous pouvez tester l'intervalle de temps directement par rapport aux intervalles de temps respectifs de ces dates. Par exemple, si je vis à San Francisco, alors je veux que le "départ" soit 12 heures du Pacifique, et la fin soit 11: 59: 59,99999 PM du temps pacifique.

Une fois que vous avez compris ce que les fuseaux horaires/etc que vous voulez considérer comme les points de début et de fin, vous pouvez simplement utiliser les intervalles de temps pour faire le test:

if ((myInterval >= [earlyMorningDate timeIntervalSinceReferenceDate]) && 
    (myInterval <= [lateEveningDate timeIntervalSinceReferenceDate])) 
{ 
    NSLog(@"Whoo hoo - it's the right date!"); 
} 
+0

24:00 midi. Peut-être que vous voulez dire 11: 59: 59.99999 ...? –

+0

Merci, Peter. Oui ... édité. – danielpunkass

1

Gardez à l'esprit que NSDate ne représente pas un "jour" sous quelque forme que ce soit, juste un point dans le temps. Vous devrez faire un peu de travail avec NSDateComponents, converti en utilisant un NSCalendar (généralement le calendrier par défaut de l'utilisateur) pour déterminer les valeurs NSDate de début et de fin, et comparez-les pour comparer votre intervalle de temps.

Je commencerais par prendre le NSDate qui tombe dans votre journée, et le convertir en un NSDateComponents, mais sans heures, minutes ou secondes. Voici un rapide (non testé) par exemple pour vous aider à démarrer:

NSDateComponents *comps = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:[NSDate date]]; 
NSDateComponents *day = [[[NSDateComponents alloc] init] autorelease]; 
[day setDay:1]; 
NSDate *start = [[NSCalendar currentCalendar] dateFromComponents:comps]; 
NSDate *end = [[NSCalendar currentCalendar] dateByAddingComponents:day toDate:start options:0]; 

Ensuite, vous pouvez comparer l'intervalle de temps comme suggéré par M. Jalkut (ou une autre méthode, NSDate peut travailler avec NSTimeIntervals en quelques façons différentes). Je passerais certainement un peu de temps à regarder NSCalendar et NSDateComponents dans les documents, vous pourriez trouver une meilleure méthode que ce que je suggère pour ce que vous devez faire.

1

Est-ce que c'est juste moi ou est-ce que l'OP semble penser qu'un NSTimeInterval est une représentation d'un intervalle dans le temps de A à B? C'est à dire. une distance absolue (en secondes) de la date A à la date B.

La question initiale doit être le repos à l'autre que vous devez trouver en fonction de la date de référence. Quelque chose comme ceci:

NSDate *refDate = someReferenceDate; 
NSTimeInterval interval = someInterval; 
NSDate *today = [NSDate date]; 
BOOL isInRange = false; 

isInRange = [today isInterval:interval inRangeFromReference:refDate]; 

Ensuite, cette méthode utiliserait certaines (ou parties de tous) des startegies que Damiel, Pierre et Marc mention ci-dessus.

Questions connexes