Синхронизация NSDate, NSCalendar и NSDateComponents

#iphone #cocoa #nsdate #nscalendar #nsdatecomponents

#iPhone #cocoa #nsdate #nscalendar #nsdatecomponents

Вопрос:

 NSDate *today = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[calendar setTimeZone:[NSTimeZone timeZoneWithName:@"GMT 2"]];

NSDateComponents *dateComponents = [calendar components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:today];    

NSInteger day = [dateComponents day];
NSInteger month = [dateComponents month];
NSInteger year = [dateComponents year];

 NSLog(@" %i %i %i ", day, month, year);
  

Этот код показывает мне «12 2147483647 2147483647»

Как я могу получить месяц и год (целое число)

Как можно добавить / переслать один день? (если мы тоже первые в этом месяце!)

Спасибо за внимание 🙂

Ответ №1:

 NSCalendar *calendar= [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDate *date = [NSDate date];
NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date];

NSInteger year = [dateComponents year];
NSInteger month = [dateComponents month];
NSInteger day = [dateComponents day];
NSInteger hour = [dateComponents hour];
NSInteger minute = [dateComponents minute];
NSInteger second = [dateComponents second];

[calendar release];
  

надеюсь, это поможет

Комментарии:

1. спасибо за помощь, мне просто нужно закодировать второй вопрос; добавлять / вычитать в день ^^

Ответ №2:

  1. Добавьте больше единиц в NSDayCalendarUnit | NSWeekdayCalendarUnit — вы не запрашиваете месяц или год, поэтому они недействительны!

  2. Добавьте / вычтите NSDateComponents объект, настроенный на 1 день и [NSCalendar dateByAddingComponents:toDate:options:] . В качестве альтернативы, и, вероятно, столь же корректно, используйте [NSDate dateWithTimeInterval:sinceDate:]

Комментарии:

1. Отлично, пожалуйста, примите ответ, чтобы люди могли его найти … вы поняли суть dateByAddingComponents ?

2. Не пытайтесь использовать кодирование на основе значений в Cocoa — все является ссылкой (то есть указателем на объект). Использование NSDate* newDate = [calendar dateByAddingComponents: oneDay toDate: self.date options: 0];

3. Вы уверены? Возможно, вы захотите сначала измерить это, в большинстве приложений постоянно создаются тонны объектов.

4. Не волнуйтесь. Ваши пользователи не могут проводить пальцем достаточно быстро, чтобы заметить создание объекта. До нескольких тысяч созданий / освобождений объектов в секунду (как минимум!) не должно быть заметно.