Я хочу получить значение четверти в классе NSDateComponents

Я хочу получить квартальное значение с указанной даты. (* переменная даты)

Так. Я сделал следующий код и запустил. но значение четверти равно нулю.

Почему стоимость четверти равна нулю? где проблема?

Пожалуйста, совет от продвинутого человека.

NSDateComponents *comp1 = [[NSDateComponents alloc] init];
[comp1 setYear:2012];
[comp1 setMonth:6];
[comp1 setDay:1];

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDate *date = [gregorian dateFromComponents:comp1];  <== want to get a quarter value.

unsigned int unitFlags = NSYearCalendarUnit | NSQuarterCalendarUnit | NSMonthCalendarUnit | NSWeekOfYearCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents *comp2 = [gregorian components:unitFlags fromDate:date];

NSLog(@"year :       %5d",[comp2 year]);
NSLog(@"quarter :    %5d",[comp2 quarter]);
NSLog(@"month :      %5d",[comp2 month]);
NSLog(@"weekofYear : %5d",[comp2 weekOfYear]);
NSLog(@"day :        %5d",[comp2 day]);

Результат:

2012-07-24 03:44:14.776 dateTest[1228:1307] year :        2012
2012-07-24 03:44:14.776 dateTest[1228:1307] quarter :        0
2012-07-24 03:44:14.777 dateTest[1228:1307] month :          6
2012-07-24 03:44:14.777 dateTest[1228:1307] weekofYear :    22
2012-07-24 03:44:14.778 dateTest[1228:1307] day :            1

person S.J. Lim    schedule 23.07.2012    source источник
comment
NSLog(@quarter : %5d,(0 == [comp2 квартал])?([comp2 месяц]-1)/3+1:[comp2 квартал]);   -  person Dickey Singh    schedule 18.12.2014
comment
Трудно поверить, что такая старая ошибка все еще встречается (Swift 3.1)   -  person Leo Dabus    schedule 27.04.2017


Ответы (2)


Кажется, что есть проблема с игнорированием NSQuarterCalendarUnit (не проверял, но видел сообщение об ошибке). Во всяком случае, это достаточно просто обойти... Просто используйте класс NSDateFormatter.

// After your NSDate *date, add...
NSDateFormatter *quarterOnly = [[NSDateFormatter alloc]init];
[quarterOnly setDateFormat:@"Q"];

int quarter = [[quarterOnly stringFromDate:date] intValue];

// Then change the quarter NSLog too
NSLog(@"quarter :    %5d", quarter);

Должно нормально работать...

person Jer In Chicago    schedule 23.07.2012
comment
приведенный выше код хорошо работает. Мне интересно, в чем причина. Спасибо за ваш ответ. - person S.J. Lim; 24.07.2012

16 декабря 2014 г.

Как насчет просто:

([comp2 месяц]-1)/3+1;

person Dickey Singh    schedule 16.12.2014
comment
Это предполагает григорианский календарь. - person Carl Lindberg; 15.11.2015