NSDate -dateWithNaturalLanguageString: en el iPhone?
-
20-09-2019 - |
Pregunta
En el i docset de teléfono para NSDate , en el área de discusión discuten -dateWithNaturalLanguageString:locale:
, sin embargo, no documentan el método en otra parte de la página.
He utilizado el método anterior para iPhone y ha funcionado muy bien, aunque me dieron advertencias. Ahora que estoy construyendo con -Werror
(que debería haber estado haciendo todo este tiempo ^ _ ^) me he encontrado una advertencia con esto.
¿Cómo iba a reemplazar a las siguientes líneas de código?
NSDate *today = [NSDate dateWithNaturalLanguageString:@"today at 23:59:59"];
NSDate *tomorrow = [NSDate dateWithNaturalLanguageString:@"tomorrow at 23:59:59"];
Solución
Una forma de hacerlo es con NSCalendar y NSDateComponents.
Para conseguir hoy en día a las 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 llegar mañana a las 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];
Otros consejos
Vamos a suponer:
static const unsigned long seconds_per_day = 60 * 60 * 24;
Usted puede obtener ahora y ahora + 24 horas con:
NSDate* today = [NSDate date]; // set for today
NSDate* tomorrow = [today addTimeInterval:seconds_per_day];
Con el fin de conseguir la medianoche del día determinado, es importante recordar que NSDate*
es puenteado a CFDateRef
, que ofrece algunas API adicionales que usted desee utilizar sin cargo. En particular, se puede convertir un NSDate
a un CFAbsoluteTime
con 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)));
... lo que se puede envolver en una función para redondear tanto today
y tomorrow
a la medianoche.