iOS и Objective-C: повторение мероприятия каждый квартал

Мне нужно, чтобы событие повторялось каждую четверть (что, я полагаю, означает увеличение примерно на 3 месяца). Так что я могу ожидать, что это перенесет дату (но это не так):

    NSDateComponents *component = [[NSDateComponents alloc] init]; // quarter
    component.quarter = 1;

    self.todoStartDate = [[NSCalendar currentCalendar] dateByAddingComponents: component toDate:self.todoStartDate options: 0];

Что-то не так с добавлением "четверти" к дате? Работает нормально при добавлении дня или недели, но не с "четвертью".

2 ответа

Я сталкивался с той же проблемой, не знаю, почему квартал не работает, поэтому обходной путь, заменив квартал на месяц * 3. Ниже показано, как вернуть три четверти назад:

        NSDateComponents *dayComponent = [[NSDateComponents alloc] init];
        NSCalendar *theCalendar = [NSCalendar currentCalendar];

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        dateFormatter.dateFormat = @"QQQ yyyy";
        NSDate *currentDate = [NSDate date];

        for (int i = -2; i <= 0; i++) {
            //dayComponent.quarter = i;
            dayComponent.month = i*3;

            NSDate *date = [theCalendar dateByAddingComponents:dayComponent toDate:currentDate options:0];

            NSString *dateString = [dateFormatter stringFromDate:date];

            NSLog(@"date = %@", dateString);
        }

Я надеюсь, что все это помогает.

(Хотелось бы добавить это как отформатированный комментарий к ответу applefreak, что довольно неплохо. Но ТАК не допускает разметку в комментариях.)

Документация Apple для NSCalendar гласит:

Некоторые календари, представленные этим API, могут отображать свои основные понятия единиц в номенклатуру год / месяц / неделя / день /…. Например, календарь, состоящий из 4 кварталов в году вместо 12 месяцев, использует единицу месяца для представления кварталов.

Теперь, это может быть намного яснее, но я думаю, что Apple говорит, что обычные календари вообще не имеют "четвертей"; у них есть только годы, месяцы (12 из них) и дни. Но вы можете подкласс NSCalendar (или создайте новый экземпляр NSCalendar?) так, чтобы в году было всего 4 месяца, а затем назвали эти месяцы "четвертями", и в интересах таких подклассов Apple заранее определила quarter имущество. Это ужасно сбивает с толку; Могу поспорить, что за WTFery от Apple есть хорошая история.

В любом случае, я согласен с applefreak, что вы все равно должны иметь дело с датами год / месяц / день, а не копаться в мифических "кругах". В конце концов, что бы это значило "добавить", скажем, на две четверти к 31 марта, учитывая, что Q3 короче, чем Q1? (И будет ли ответ зависеть от того, был ли это високосный год?)

Если то, что вы действительно хотите, - это "событие, повторяющееся каждый год 1 января, 1 апреля, 1 июля и 1 октября", то вам следует написать это. Даже не думайте о "добавлении трех месяцев", которое имеет те же проблемы, что и "добавление одной четверти".

Кстати, другие люди здесь заметили quarter WTF также. Например: я хочу получить значение четверти в классе NSDateComponents

Другие вопросы по тегам