5

我有最简单的任务,我不知道如何正确完成。通过下面的片段,我可以找出一个月的开始。

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 月的情况下,该方法不会接受 12 + 1 = 13 来到达 1 月,对吗?

那我怎么才能到一个月的最后一秒呢?

4

3 回答 3

3

这样做以获得下个月的开始:

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setMonth:1];
NSDate *beginningOfNextMonth = [cal dateByAddingComponents:comps toDate:beginning options:0];
[comps release];
于 2011-06-05T20:43:02.787 回答
3

好吧,我想我有它。我正在使用该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给出的答案更清楚地传达了目的。

于 2011-06-05T20:43:33.010 回答
0

本月的最后一秒...大多数情况下,这归结为下个月的第一秒,然后减去一秒。

但是你问对了问题吗?最后一秒是什么意思?我的猜测是,您想表达一个时间间隔,从(包括)N 月的第一秒开始,到 N+1 月的第一秒之前结束。

于 2011-06-05T20:27:48.693 回答