Datebyadding components и получение разницы дат с помощью NSDateComponents

StackOverflow https://stackoverflow.com/questions/2512520

  •  22-09-2019
  •  | 
  •  

Вопрос

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

Итак, для добавления, если я добавлю 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 в опции как для добавляющих, так и для разностных функций, но без разницы.

Спасибо

Это было полезно?

Решение

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

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

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

Пока вы не покажете код для создания ваших переменных Date1 и Date2, нет реального способа определить.

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

Другие советы

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

Спасибо Лохматому Лягушонку за то, что направил меня в правильном направлении.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top