Получение первой даты текущего квартала

Я пытаюсь получить первую и последнюю дату текущего квартала, я использую его:

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitQuarter | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]]; components.quarter = 1; funStartDate = [[NSCalendar currentCalendar] dateFromComponents: components]; NSLog(@"First day of quater: %@", funStartDate); [components setQuarter:[components quarter]+1]; funEndDate = [[NSCalendar currentCalendar] dateFromComponents: components]; NSLog(@"Last day of quater: %@", [funEndDate descriptionWithLocale:[NSLocale currentLocale]]); 

Но на обеих консольных принтерах я вижу сегодняшнюю дату. Что я делаю неправильно?

ОБНОВЛЕНО: я обнаружил, что ошибка Apple с квартальным блоком все еще существует в iOS 7.1, поэтому не используйте это устройство в своих компонентах даты.

Здесь у меня есть рабочее решение для вас:

первый день квартала:

  NSDate *date = <whatever>; NSCalendar *currentCalendar = [NSCalendar currentCalendar]; NSDate *startOfQuarter; [currentCalendar rangeOfUnit: NSQuarterCalendarUnit startDate: &startOfQuarter interval: NULL forDate: date]; NSLog(@"quarter starts at %@", startOfQuarter); 

последний день квартала:

  NSDateComponents* comps = [currentCalendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:date]; NSUInteger quartalNum = (comps.month - 1) / 3 + 1; NSUInteger lastQuartalMonthNum = quartalNum * 3; NSUInteger nextQuartalFirstMonth = lastQuartalMonthNum + 1 [comps setMonth: nextQuartalFirstMonth]; [comps setDay: 0]; // with 0 day we get last day of previous month NSLog(@"quarter ends at %@", [currentCalendar dateFromComponents: comps]); 

Swift 3.1. Квартальный компонент все еще не работает. Временное решение:

 extension Date { public var startOfQuarter: Date { let startOfMonth = Calendar.current.date(from: Calendar.current.dateComponents([.year, .month], from: Calendar.current.startOfDay(for: self)))! var components = Calendar.current.dateComponents([.month, .day, .year], from: startOfMonth) let newMonth: Int switch components.month! { case 1,2,3: newMonth = 1 case 4,5,6: newMonth = 4 case 7,8,9: newMonth = 7 case 10,11,12: newMonth = 10 default: newMonth = 1 } components.month = newMonth return Calendar.current.date(from: components)! } } 

Применение:

 Date().startOfQuarter 
  • Как проверить, находится ли сейчас дата в течение 9: 00-18: 00
  • Проверьте, есть ли время до или после двух сохраненных строк текстовой строки
  • Как добавить один месяц в NSDate?
  • Swift - Как проверить, соответствует ли NSDate вчерашнему времени?
  • Parse.com Запрос с двумя датами
  • Разделы iOS - UITableView на основе диапазонов дат
  • Укажите дату и время iPhone в приложении для тестирования?
  • Добавление дней в NSDate
  • NSDate dateWithTimeIntervalSince1970: мне нужно вычесть 1800 секунд из NSTimeInterval, чтобы отобразить правильное значение
  • Создание NSDate с определенным временем
  • NSDate изменил описание вывода?
  • Давайте будем гением компьютера.