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

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

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

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

Есть ли что-то неправильное в добавлении «четверти» к дате? Он отлично работает при добавлении дня или недели, но не с «четвертью».


person Z S    schedule 28.07.2012    source источник
comment
Возможно, в качестве альтернативы вы могли бы просто использовать первый день четырех разных месяцев, например. Январь, апрель, июль и октябрь (зависит от того, используете ли вы конкретно григорианский календарь и т. д.)   -  person dreamlax    schedule 28.07.2012
comment
Спасибо. Вот в чем дело: я не хочу делать предположение, для какого календаря настроен пользователь. Я бы предпочел, чтобы базовый класс занимался этим расчетом. Но, похоже, он этого не делает, и я не могу найти больше документации по нему.   -  person Z S    schedule 28.07.2012


Ответы (2)


(Хотел бы я добавить это как отформатированный комментарий к ответу applefreak, который довольно хорош. Но SO не разрешает разметку в комментариях.)

Документация Apple для NSCalendar< /а> говорит:

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

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

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

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

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

person Quuxplusone    schedule 10.09.2012

Я столкнулся с той же проблемой, не знаю, почему квартал не работает, поэтому обходной путь, заменив квартал на месяц * 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);
        }

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

person thanhbinh84    schedule 18.06.2013