0

在NSDate的 i Phone 文档集中,在他们讨论的讨论区中-dateWithNaturalLanguageString:locale:,但是他们没有在页面的其他地方记录该方法。

我以前在 iPhone 上使用过这种方法,它工作得很好,尽管我收到了警告。现在我正在构建-Werror(我应该一直这样做^_^)我遇到了一个警告。

我将如何替换以下代码行?

NSDate *today = [NSDate dateWithNaturalLanguageString:@"today at 23:59:59"];
NSDate *tomorrow = [NSDate dateWithNaturalLanguageString:@"tomorrow at 23:59:59"];
4

2 回答 2

2

一种方法是使用 NSCalendar 和 NSDateComponents。

要在今天 23:59:59 获得:

NSDate *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];

NSDateComponents *comps = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit 
                                      fromDate:date];

[comps setHour:23];
[comps setMinute:59];
[comps setSecond:59];

NSDate *today = [calendar dateFromComponents:comps];

明天 23:59:59 到达:

NSDate *now = [NSDate dateWithTimeIntervalSinceNow:24 * 60 * 60]; // 24h from now
NSCalendar *calendar = [NSCalendar currentCalendar];

NSDateComponents *comps = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit 
                                      fromDate:date];

[comps setHour:23];
[comps setMinute:59];
[comps setSecond:59];

NSDate *tomorrow = [calendar dateFromComponents:comps];
于 2009-08-27T21:56:02.343 回答
1

让我们假设:

static const unsigned long seconds_per_day = 60 * 60 * 24;

您可以通过以下方式获得现在和现在+24 小时:

NSDate* today = [NSDate date]; // set for today
NSDate* tomorrow = [today addTimeInterval:seconds_per_day];

为了获得给定日期的午夜,重要的是要记住它NSDate*是免费桥接到的CFDateRef,它提供了一些您想要使用的额外 API。特别是,您可以将 an 转换NSDateCFAbsoluteTimewith CFDateGetAbsoluteTime

CFAbsoluteTime abstime = CFDateGetAbsoluteTime(reinterpret_cast<CFDateRef>(myNSDate));
long long      inttime = static_cast<long long>(abstime);

inttime = (inttime / seconds_per_day) * seconds_per_day; // clips the time to midnight

NSDate* myNSDateAtMidnight = reinterpret_cast<NSDate*>(CFDateCreate(NULL,
                                                       static_cast<CFAbsoluteTime>(inttime)));

...您可以将其包装成一个函数来舍入todaytomorrow午夜。

于 2009-08-27T03:16:01.117 回答