在第i 对于NSDate的电话文档集的,在他们讨论-dateWithNaturalLanguageString:locale:讨论区,但他们并不在别处文件鉴别方法在页面上。

我以前使用的方法为iPhone和它的工作就好了,虽然我得到了警告。如今,我将建设有-Werror(这是我应该做的事情一直^ _ ^),我碰到这个警告。

如何将取代的下列代码行?

NSDate *today = [NSDate dateWithNaturalLanguageString:@"today at 23:59:59"];
NSDate *tomorrow = [NSDate dateWithNaturalLanguageString:@"tomorrow at 23:59:59"];
有帮助吗?

解决方案

要做到这一点的一种方法是用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];

其他提示

让我们假设:

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。特别地,可以将NSDate转换为CFAbsoluteTimeCFDateGetAbsoluteTime

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四舍五入到午夜。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top