www today theice prices market futures exchange chart barchart bar cocoa date performance

cocoa - today - ¿Hay una mejor manera de encontrar la medianoche mañana?



ice futures us (6)

Convierta su fecha y hora actual en una fecha Unix (segundos desde 1970) o estilo DOS (desde 1980), luego agregue 24 horas y conviértalo nuevamente. Luego restablezca las horas, los minutos y los segundos a cero para llegar a la medianoche.

¿Hay una mejor manera de hacer esto?

-(NSDate *)getMidnightTommorow { NSCalendarDate *now = [NSCalendarDate date]; NSCalendarDate *tomorrow = [now dateByAddingYears:0 months:0 days:1 hours:0 minutes:0 seconds:0]; return [NSCalendarDate dateWithYear:[tomorrow yearOfCommonEra] month:[tomorrow monthOfYear] day:[tomorrow dayOfMonth] hour:0 minute:0 second:0 timeZone:[tomorrow timeZone]]; }

Tenga en cuenta que siempre quiero la próxima medianoche, incluso si es la medianoche cuando hago esa llamada, sin embargo, si son las 23:59:59, por supuesto quiero que llegue la medianoche en un segundo.

Las funciones del lenguaje natural parecen escamosas, y no estoy seguro de qué haría Cocoa si paso el 32 en el campo "día". (Si eso funciona, podría cancelar la llamada [now dateByAddingYears: ...])


No, será de la misma manera que usas para encontrar la medianoche de hoy.


NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; NSDate *tomorrow = [NSDate dateWithTimeIntervalSinceNow:(24 * 60 * 60)]; NSDateComponents *components = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:tomorrow]; NSDate *midnight = [gregorian dateFromComponents:components];


De la documentación :

Se desaconseja el uso de NSCalendarDate. Todavía no está en desuso, sin embargo, puede estar en la próxima versión del sistema operativo después de Mac OS X v10.5. Para los cálculos calendáricos, debe usar las combinaciones adecuadas de NSCalendar, NSDate y NSDateComponents, tal como se describe en Calendarios en los temas de programación de fechas y horas para Cocoa .

Siguiendo ese consejo:

NSDate *today = [NSDate date]; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *components = [[NSDateComponents alloc] init]; components.day = 1; NSDate *tomorrow = [gregorian dateByAddingComponents:components toDate:today options:0]; [components release]; NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; components = [gregorian components:unitFlags fromDate:tomorrow]; components.hour = 0; components.minute = 0; NSDate *tomorrowMidnight = [gregorian dateFromComponents:components]; [gregorian release]; [components release];

(No estoy seguro si esta es la implementación más eficiente, pero debería servir como un puntero en la dirección correcta).

Nota: En teoría, puede reducir la cantidad de código al permitir que los componentes de una fecha presenten valores mayores que el rango de valores normales para el componente (por ejemplo, simplemente agregue 1 al componente día, lo que podría dar como resultado un valor de 32 ) Sin embargo, aunque dateFromComponents: puede tolerar valores fuera de límites, no está garantizado. Le recomendamos encarecidamente que no confíe en él.


[NSDate dateWithNaturalLanguageString:@"midnight tomorrow"];


Puedes intentarlo de esta manera:

NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *comps = [[NSDateComponents alloc] init]; [comps setDay:1]; NSDate *tomorrow = [calendar dateByAddingComponents:comps toDate:[NSDate date] options:0]; //it gives us tomorrow with current time NSDate *midnight = [calendar startOfDayForDate:tomorrow]; //here we get next midnight

También es fácil recuperar el intervalo de segundos si es necesario para configurar un NSTimer:

double intervalToMidnight = midnight.timeIntervalSinceNow;