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

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

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]]);

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

2 ответа

ОБНОВЛЕНО: Я обнаружил, что ошибка 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]);

Свифт 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
Другие вопросы по тегам