我有最简单的任务,我无法弄清楚如何正确地做。通过下面的代码片段,我可以找到一个月的开头。
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月,对吧?
那我怎么能到达一个月的最后一秒?
答案 0 :(得分:3)
这样做是为了下个月的开始:
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setMonth:1];
NSDate *beginningOfNextMonth = [cal dateByAddingComponents:comps toDate:beginning options:0];
[comps release];
答案 1 :(得分: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];
}
注意:虽然此代码的工作方式与我的预期有效,但the answer that @spacehunt更明确地传达了目的。
答案 2 :(得分:0)
本月最后一秒......大部分时间,归结为下个月的第一秒,减去一秒。
但你问的是正确的问题吗?那最后一秒是什么意思?我的猜测是你要表达一个时间间隔,从(包括)N个月的第一个秒开始,到N + 1个月的第一个秒之前结束。