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;