dateByAddingComponents et obtenir la différence de dates avec NSDateComponents
-
22-09-2019 - |
Question
Je rencontre des problèmes avec l'ajout de valeurs aux dates et aussi obtenir des différences entre les dates. Les dates et les composants calculés sont incorrects.
Donc, pour ajouter, si j'ajoute 1,5 mois, je ne reçois que 1 mois, si j'ajouter un nombre entier ie (1 ou 2 ou 3 et etc) il calcule correctement.
Float32 addAmount = 1.5;
NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
[components setMonth:addAmount];
NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[gregorian setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
NSDate *newDate2 = [gregorian dateByAddingComponents:components toDate:Date1 options:0];
Maintenant la différence, si j'ai une date qui a été ajouté avec exactement un an (code presque comme ci-dessus), il ajoute correctement, mais quand on calcule la différence, je reçois 0 ans, 11 mois et 30 jours.
NSDate *startDate = Date1;
NSDate *endDate = Date2;
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *components = [gregorian components:unitFlags
fromDate:startDate
toDate:endDate options:0];
NSInteger years = [components year];
NSInteger months = [components month];
NSInteger days = [components day];
Qu'est-ce que je fais mal? Aussi j'ai ajouté le constanct kCFCalendarComponentsWrap dans les options pour les fonctions d'ajout et de différence, mais sans différence.
Merci
La solution
Donc, pour ajouter, si j'ajoute 1,5 mois, je seulement obtenir 1 mois, si j'ajouter une ie nombre entier (1, 2 ou 3 et etc) il calcule correctement.
La méthode de setMonth:
en NSDateComponents
prend une NSInteger
, pas un nombre en virgule flottante. Ainsi, le comportement est correct, car il est tout simplement tronquer 1,5 à 1.
Maintenant la différence, si j'ai une date qui a été ajouté avec exactement un année (code presque comme ci-dessus), il ajoute correctement, mais quand le la différence est calculée, je reçois 0 ans, 11 mois et 30 jours.
Sauf si vous montrer le code de la façon dont vos variables date1 et date2 sont créés, il n'y a aucun moyen de dire.
(Vous fuite de mémoire également ci-dessus, toujours correspondre à une alloc avec un release
/ autorelease
Et essayez de ne pas donner vos variables lettres capitales, car en tant que question de style, qui ne devrait être fait pour les noms de classe.)
Autres conseils
J'ai finalement trouvé le problème avec la différence de ce jour, quand je gardais un db, j'ai utilisé timeintervalsince1970 avec une valeur double, mais lors du remplissage et la mise à un datepicker, je travaillais avec un type de colonne int.
Merci Shaggy Frog pour moi diriger dans la bonne direction.