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