有一个更好的方法吗?

-(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:可以容忍超出范围的值,但并不能保证。强烈建议您不要依赖它。

10-07 19:10