Nsdate -DateWithNaturalLanguageString: no iPhone?
-
20-09-2019 - |
Pergunta
No iTelefone Docset para nsdate, na área de discussão que eles discutem -dateWithNaturalLanguageString:locale:
, no entanto, eles não documentam o método em outras partes da página.
Eu já usei o método antes para o iPhone e funcionou muito bem, embora eu tenha recebido avisos. Agora que estou construindo com -Werror
(O que eu deveria estar fazendo o tempo todo ^_ ^) Eu encontrei um aviso com isso.
Como eu substituiria as seguintes linhas de código?
NSDate *today = [NSDate dateWithNaturalLanguageString:@"today at 23:59:59"];
NSDate *tomorrow = [NSDate dateWithNaturalLanguageString:@"tomorrow at 23:59:59"];
Solução
Uma maneira de fazer isso é com o NSCalendar e o NSDATECOMPONENTS.
Para chegar hoje às 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];
Para chegar amanhã às 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];
Outras dicas
Vamos assumir:
static const unsigned long seconds_per_day = 60 * 60 * 24;
Você pode obter agora e agora+24 horas com:
NSDate* today = [NSDate date]; // set for today
NSDate* tomorrow = [today addTimeInterval:seconds_per_day];
Para chegar à meia -noite para o dia determinado, é importante lembrar que NSDate*
é preenchido gratuito para CFDateRef
, que fornece algumas APIs adicionais que você deseja usar. Em particular, você pode converter um NSDate
para um CFAbsoluteTime
com 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)));
... que você pode envolver em uma função para arredondar os dois today
e tomorrow
até meia -noite.