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"];
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top