有一个更好的方法吗?
-(NSDate *)getMidnightTommorow {
NSCalendarDate *now = [NSCalendarDate date];
NSCalendarDate *tomorrow = [now dateByAddingYears:0 months:0 days:1 hours:0 minutes:0 seconds:0];
return [NSCalendarDate dateWithYear:[tomorrow yearOfCommonEra]
month:[tomorrow monthOfYear]
day:[tomorrow dayOfMonth]
hour:0
minute:0
second:0
timeZone:[tomorrow timeZone]];
}
请注意,即使拨打电话的恰好是午夜,我也总是希望下一个午夜,但是,如果恰好是23:59:59,我当然想要一秒钟后的午夜。
自然语言功能似乎很不稳定,而且我不确定如果我在“day”字段中传递32,那么 cocoa 会做什么。 (如果可以的话,我可以放弃[now dateByAddingYears:...]调用)
最佳答案
从documentation:
遵循该建议:
NSDate *today = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
components.day = 1;
NSDate *tomorrow = [gregorian dateByAddingComponents:components toDate:today options:0];
[components release];
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
components = [gregorian components:unitFlags fromDate:tomorrow];
components.hour = 0;
components.minute = 0;
NSDate *tomorrowMidnight = [gregorian dateFromComponents:components];
[gregorian release];
[components release];
(我不确定这是否是最有效的实现,但它应该作为正确方向的指针。)
注意:从理论上讲,您可以在此处减少代码量,方法是允许日期组件对象的值大于该组件正常值的范围(例如,简单地将1添加到day组件,这可能会导致其值为32 )。但是,尽管
dateFromComponents:
可以容忍超出范围的值,但并不能保证。强烈建议您不要依赖它。