2015-03-28 1 views
2

j'ai 2 NSDates qui définissent une période, on pourrait les mettre comme çade Split NSDate qui s'étend sur plusieurs jours dans plusieurs travées

spanA: 12:00 today 
spanB: 12:00 tomorrow 

Cela équivaut à 24 heures, mais je dois créer deux gammes au lieu de un, de sorte qu'aucune travée ne s'étende à minuit. Le résultat de l'exemple ci-dessus ressemblerait à ceci:

spanA: 12:00 today 
spanB: 23:59 today 

spanC: 00:01 tomorrow 
spanD: 12:00 tomorrow 

Je ne suis pas sûr comment faire ceci. Je suis venu avec une idée d'utiliser une fonction comme ceci:

- (NSInteger)daysBetweenDate:(NSDate *)fromDateTime andDate:(NSDate *)toDateTime 
{ 
NSDate *fromDate; 
NSDate *toDate; 

NSCalendar *calendar = [NSCalendar currentCalendar]; 

[calendar rangeOfUnit:NSCalendarUnitDay startDate:&fromDate 
      interval:NULL forDate:fromDateTime]; 
[calendar rangeOfUnit:NSCalendarUnitDay startDate:&toDate 
      interval:NULL forDate:toDateTime]; 

NSDateComponents *difference = [calendar components:NSCalendarUnitDay 
              fromDate:fromDate toDate:toDate options:0]; 

return [difference day]; 
} 

qui retourne combien de jours la durée étend à travers, ou en d'autres termes: le nombre de portées nécessaires. Ensuite, je pourrais par exemple boucler le nombre de jours et ajouter une certaine logique pour créer les intervalles nécessaires.

J'utilise cela comme une structure pour les travées:

typedef struct 
{ 
NSTimeInterval start; 
NSTimeInterval end; 
} span; 

Quelle serait la meilleure approche pour cela?

Répondre

2

Puisque toutes les portées, sauf peut-être le premier et le dernier sont portées d'une journée identique, vous pouvez utiliser cet algorithme:

  • Vérifiez l'heure de départ est un minuit. S'il ne s'agit pas de minuit, ajoutez une période d'ouverture du début à minuit du même jour.
  • Pour chaque jour après le premier minuit, ajoutez un intervalle de jour à minuit du jour suivant
  • Vérifiez si la dernière fois est un minuit. Si ce n'est pas minuit, ajoutez une durée de fermeture au résultat.
+0

Vous pouvez utiliser ce framework (https://github.com/abdullah-chhatra/iDate) pour faciliter l'implémentation de cet algorithme. – Abdullah

+0

pensé à cela aussi, en train de mettre en œuvre – Erik