dateByAddingComponents и получение разницы дат с NSDateComponents - PullRequest
1 голос
/ 25 марта 2010

У меня проблемы с добавлением значений к датам, а также с получением различий между датами. Даты и компоненты рассчитаны неверно.

Таким образом, для добавления, если я добавляю 1,5 месяца, я получаю только 1 месяц, однако, если я добавляю любое целое число, т. Е. (1 или 2 или 3 и т. Д.), Он вычисляется правильно.

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];

Теперь для разницы, если у меня есть дата, которая была добавлена ​​ровно с одним годом (почти такой же код, как и выше), она добавляется правильно, но когда вычисляется разница, я получаю 0 лет, 11 месяцев и 30 дней.

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];

Что я делаю не так? Также я добавил константу kCFCalendarComponentsWrap в опциях для функций добавления и разности, но без разницы.

Спасибо

Ответы [ 2 ]

1 голос
/ 25 марта 2010

Так что для добавления, если я добавлю 1,5 месяца, я получить только 1 месяц, однако, если я добавлю какие-либо целое число т.е. (1 или 2 или 3 и т. д.) он рассчитывает правильно.

Метод setMonth: в NSDateComponents принимает NSInteger, а не число с плавающей запятой. Таким образом, поведение правильное, так как оно просто усекает 1.5 до 1.

Теперь для разницы, если у меня есть свидание который был добавлен ровно с одним год (почти такой же код, как и выше), это добавляет правильно, но когда разница вычисляется, я получаю 0 лет, 11 месяцев и 30 дней.

Если вы не покажете код для того, как создаются переменные Date1 и Date2, нет реального способа узнать это.

(Вы также теряете память выше; всегда сопоставляйте alloc с release / autorelease. И старайтесь не указывать переменные заглавными буквами, поскольку из соображений стиля это следует делать только для класса имена)

0 голосов
/ 25 марта 2010

Я, наконец, обнаружил проблему с разницей в датах, когда я сохранял ее в БД, я использовал timeintervalsince1970 с двойным значением, но при его заполнении и установке даты в качестве средства выбора даты я использовал тип столбца int.

Спасибо Shaggy Frog за то, что направил меня в правильном направлении.

...