Вычисление конца месяца или его последней секунды - PullRequest
5 голосов
/ 06 июня 2011

У меня самая простая задача, которую я не могу понять, как правильно делать. С помощью фрагмента ниже я могу узнать начало месяца.

NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *beginning = nil;
[cal rangeOfUnit:NSMonthCalendarUnit startDate:&beginning interval:NULL forDate:self];
return beginning;

Теперь я хочу определить конец того же месяца (последняя секунда в 23:59:59 подойдет для моих целей). Моей первой мыслью было начать в первый день следующего месяца и вычесть второй. Но я не смог разбить дату в экземпляре NSDateComponent до [dateComponents setMonth:[dateComponents month] + 1], потому что в случае с декабрь этот метод не принял бы 12 + 1 = 13, чтобы добраться до января, верно?

Тогда как мне добраться до последней секунды месяца?

Ответы [ 3 ]

3 голосов
/ 06 июня 2011

Сделайте это, чтобы получить начало следующего месяца:

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setMonth:1];
NSDate *beginningOfNextMonth = [cal dateByAddingComponents:comps toDate:beginning options:0];
[comps release];
3 голосов
/ 06 июня 2011

Хорошо, я думаю, что у меня есть.Я использую метод rangeOfUnit:inUnit:forDate: для определения продолжительности текущего месяца в днях и добавляю соответствующий NSTimeInterval к ​​дате начала месяца.

- (NSDate *)firstSecondOfTheMonth {
    NSCalendar *cal = [NSCalendar currentCalendar];
    NSDate *beginning = nil;
    if ([cal rangeOfUnit:NSMonthCalendarUnit startDate:&beginning interval:NULL forDate:self])
        return beginning;
    return nil;
}

- (NSDate *)lastSecondOfTheMonth {
    NSDate *date = [self firstSecondOfTheMonth];
    NSCalendar *cal = [NSCalendar currentCalendar];
    NSRange month = [cal rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:date];
    return [date dateByAddingTimeInterval:month.length * 24 * 60 * 60 - 1];
}

Примечание.код работает так, как я хотел, ответ, который дал @ spacehunt , более четко отражает цель.

0 голосов
/ 06 июня 2011

Последняя секунда месяца ... Большую часть времени это сводится к тому, чтобы взять первую секунду следующего месяца и вычесть одну секунду.

Но вы задаете правильный вопрос? В чем смысл этой последней секунды? Я предполагаю, что вы хотите выразить временной интервал, начинающийся (включая) первую секунду месяца N и заканчивающийся непосредственно перед первой секундой месяца N + 1.

...