NSDate -dateWithNaturalLanguageString: на iPhone? - PullRequest
0 голосов
/ 27 августа 2009

В наборе документов i Phone для NSDate , в области обсуждения они обсуждают -dateWithNaturalLanguageString:locale:, однако они не документируют метод в другом месте на странице.

Я уже использовал этот метод для iPhone, и он отлично работал, хотя я получил предупреждения. Теперь, когда я строю с -Werror (что я должен был делать все время ^ _ ^), я столкнулся с предупреждением с этим.

Как бы заменить следующие строки кода?

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

Ответы [ 2 ]

2 голосов
/ 28 августа 2009

Один из способов сделать это - использовать 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];
1 голос
/ 27 августа 2009

Предположим:

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 в CFAbsoluteTime с помощью 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)));

... которую вы можете заключить в функцию для округления today и tomorrow до полуночи.

...