J'ai deux objets NSDate et je veux que la différence entre les deux et le résultat soit à nouveau un objet NSDate. Une idée de comment y parvenir?
Ici, j'essaie de résoudre un problème unique où je dois trouver le temps écoulé, puis localiser le temps écoulé. Je peux le localiser si j'ai le temps écoulé dans l'objet NSDate. J'ai donc pensé à créer un objet NSDate qui a sa composante de temps identique à l'intervalle de temps entre les deux dates afin que je puisse utiliser NSDateFormatter pour le localiser.
NSDate
représente une instance dans le temps, il n'est donc pas logique de représenter un intervalle de temps sous la forme d'un NSDate
. Ce que vous voulez, c'est NSDateComponents
:
NSDate *dateA;
NSDate *dateB;
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay
fromDate:dateA
toDate:dateB
options:0];
NSLog(@"Difference in date components: %i/%i/%i", components.day, components.month, components.year);
Si vous soustrayez 12/12/2001 du 05/05/2002 quelle sera la date? La distance chronologique entre deux dates ne peut pas être une date, c'est toujours une sorte d'intervalle. Vous pouvez utiliser timeIntervalSinceDate: pour calculer l'intervalle.
Pour localiser, vous pouvez essayer les étapes suivantes:
Vous pouvez utiliser le NSCalendar avec dateFromComponents: en passant un NSDateComponents .
Pour décomposer un TimeInterval en NSDateComponents regardez Comment puis-je décomposer un NSTimeInterval en année, mois, jours, heures, minutes et secondes sur iPhone? .
Enfin, utilisez NSDateFormatter et initWithDateFormat: allowNaturalLanguage: pour obtenir votre chaîne localisée. Syntaxe de chaîne de format de date montre les différents espaces réservés.
À partir de la référence de classe NSDate
, vous avez des méthodes d'instance pour les faire -
isEqualToDate:
timeIntervalSinceDate:
Vous pouvez calculer l'intervalle de temps entre deux dates en utilisant NSDate
's timeIntervalSinceDate:
, mais cela n'a aucun sens pour vous de représenter un intervalle de temps comme une date.
Il existe un moyen simple d'utiliser -compare: dans NSDate:
NSDate *dateA = [NSDate dateWithTimeIntervalSinceNow:100];
NSDate *dateB = [NSDate dateWithTimeIntervalSinceNow:200];
NSDate *myDate = [NSDate dateWithTimeIntervalSinceNow:150];
NSArray *dateArray = [NSArray arrayWithObjects:dateA, dateB, myDate, nil];
NSArray *sortedArray = [dateArray sortedArrayUsingSelector:@selector(compare:)];
if ([myDate isEqualToDate:[sortedArray objectAtIndex:1]])
NSLog(@"myDatea between dateA and dateB");