有没有更好的方法来找到明天的午夜?

时间:2008-10-08 05:26:11

标签: cocoa date performance

有更好的方法吗?

-(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,我当然希望午夜即将到来。

自然语言功能似乎很脆弱,如果我在“白天”字段中通过32,我不确定Cocoa会做什么。 (如果这有效,我可以放弃[now dateByAddingYears:...]电话)

6 个答案:

答案 0 :(得分:25)

来自documentation

  

强烈使用NSCalendarDate   泄气。它尚未弃用,   但它可能在下一个主要操作系统中   在Mac OS X v10.5之后发布。对于   日历计算,你应该   使用合适的组合   NSCalendar,NSDate和   NSDateComponents,如中所述   Dates and Times Programming Topics for Cocoa中的日历。

遵循以下建议:

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,这可能会导致其具有价值32)。但是,虽然dateFromComponents: 可能容忍越界值,但不能保证。强烈建议你不要依赖它。

答案 1 :(得分:7)

没有 - 它将与你今天午夜时使用的方式相同。

答案 2 :(得分:4)

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];

NSDate *tomorrow = [NSDate dateWithTimeIntervalSinceNow:(24 * 60 * 60)];

NSDateComponents *components = [gregorian components:(NSYearCalendarUnit |
                                                      NSMonthCalendarUnit |
                                                      NSDayCalendarUnit)
                                            fromDate:tomorrow];

NSDate *midnight = [gregorian dateFromComponents:components];

答案 3 :(得分:1)

[NSDate dateWithNaturalLanguageString:@"midnight tomorrow"];

答案 4 :(得分:0)

将您当前的日期和时间转换为Unix日期(自1970年以来的秒数)或DOS风格(自1980年以来),然后再添加24小时并将其转换回来。然后将小时,分钟和秒重置为零,以便到达午夜。

答案 5 :(得分:0)

您可以尝试这种方式:

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:1];
NSDate *tomorrow = [calendar dateByAddingComponents:comps toDate:[NSDate date] options:0]; //it gives us tomorrow with current time
NSDate *midnight = [calendar startOfDayForDate:tomorrow]; //here we get next midnight

如果需要设置NSTimer,也可以轻松检索秒间隔:

double intervalToMidnight = midnight.timeIntervalSinceNow;