NSDate -dateWithNaturalLanguageString:на айфоне?
-
20-09-2019 - |
Вопрос
В яТелефонная документация для 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
к 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
до полуночи.