2010-11-03 10 views
87

¿Cómo puedo calcular el tiempo transcurrido en horas entre dos veces (posiblemente en días diferentes) en iOS?Cómo calcular el tiempo en horas entre dos fechas en iOS

+1

Otra opción es usar 'NSCalendar' de [' -Componentes: fromdate: TODATE: opciones: '] (http://developer.apple.com/library/ios/#documentation/Cocoa/Reference /Fundación/Classes/NSCalendar_Class/Reference/NSCalendar.html) método. –

+0

No creo que esto le dará un número absoluto de horas. Solo le dará un valor de 0 a 24, donde tendrá que confiar en los componentes Día, Mes y Año para obtener el intervalo de tiempo completo. – jonsibley

+0

Probé esto, y funciona muy bien. Con fromDate 1/Jan/2012 y toDate 4/Jan/2012 esto devolvió 96 horas. –

Respuesta

153

El NSDate función timeIntervalSinceDate: le dará la diferencia de dos fechas en cuestión de segundos.

NSDate* date1 = someDate; 
NSDate* date2 = someOtherDate; 
NSTimeInterval distanceBetweenDates = [date1 timeIntervalSinceDate:date2]; 
double secondsInAnHour = 3600; 
NSInteger hoursBetweenDates = distanceBetweenDates/secondsInAnHour; 

Sede, la biblioteca de referencia manzanahttp://developer.apple.com/library/mac/navigation/ o si está usando Xcode simplemente seleccione ayuda/documentación en el menú.

Ver: how-to-convert-an-nstimeinterval-seconds-into-minutes

--edit: Ver ÐąrέÐέvil's answer below for correctly handling daylight savings/leap seconds

+2

¿Y qué pasa si las fechas/horas cruzan la transición para el horario de verano? – Abizern

+2

@Abizern: Gracias, no estaba considerando esos casos cuando respondí la pregunta. Me he vinculado a la respuesta por ÐąrέÐέvil – Akusete

+0

tengo un intervalo de tiempo como 4:50:30, h: m: s tengo que restar este tiempo de 12:30:20 ¿cómo voy a hacer esto –

67
NSCalendar *c = [NSCalendar currentCalendar]; 
NSDate *d1 = [NSDate date]; 
NSDate *d2 = [NSDate dateWithTimeIntervalSince1970:1340323201];//2012-06-22 
NSDateComponents *components = [c components:NSHourCalendarUnit fromDate:d2 toDate:d1 options:0]; 
NSInteger diff = components.minute; 

NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit 

cambiar los componentes necesarios a día, hora o minuto, lo que diferencia desea. Si NSDayCalendarUnit se selecciona entonces va a devolver el número de días entre dos fechas de manera similar para NSHourCalendarUnit y NSMinuteCalendarUnit

+0

¿Qué valor dateWithTimeIntervalSince1970 aceptar? Creo que ha convertido la fecha 2012-06-22 a 1340323201. Por favor, corríjanme. – Jeet

+0

sí, vea la fecha comentada :) – aahsanali

+3

+1 para hacer esto correctamente. – Abizern

19
-(NSMutableString*) timeLeftSinceDate: (NSDate *) dateT { 

    NSMutableString *timeLeft = [[NSMutableString alloc]init]; 

    NSDate *today10am =[NSDate date]; 

    NSInteger seconds = [today10am timeIntervalSinceDate:dateT]; 

    NSInteger days = (int) (floor(seconds/(3600 * 24))); 
    if(days) seconds -= days * 3600 * 24; 

    NSInteger hours = (int) (floor(seconds/3600)); 
    if(hours) seconds -= hours * 3600; 

    NSInteger minutes = (int) (floor(seconds/60)); 
    if(minutes) seconds -= minutes * 60; 

    if(days) { 
     [timeLeft appendString:[NSString stringWithFormat:@"%ld Days", (long)days*-1]]; 
    } 

    if(hours) { 
     [timeLeft appendString:[NSString stringWithFormat: @"%ld H", (long)hours*-1]]; 
    } 

    if(minutes) { 
     [timeLeft appendString: [NSString stringWithFormat: @"%ld M",(long)minutes*-1]]; 
    } 

    if(seconds) { 
     [timeLeft appendString:[NSString stringWithFormat: @"%lds", (long)seconds*-1]]; 
    } 

    return timeLeft; 
} 
+8

No, no hagas esto. No todas las horas tienen 3600 segundos. No todos los días tienen 24 horas. – rmaddy

+4

Esto es totalmente incorrecto. No tiene en cuenta los segundos intercalares, el ahorro de horario de verano. Por favor, no reinvente la rueda solo use las API provistas con iOS como NSDateComponents. –

6

Pedido: Se encarga de horario de verano, año bisiesto, ya que utiliza el calendario para calcular el IOS. Puede cambiar la cadena y las condiciones para incluir minutos con horas y días.

+(NSString*)remaningTime:(NSDate*)startDate endDate:(NSDate*)endDate { 

    NSDateComponents *components; 
    NSInteger days; 
    NSInteger hour; 
    NSInteger minutes; 
    NSString *durationString; 

    components = [[NSCalendar currentCalendar] components: NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute 
               fromDate: startDate toDate: endDate options: 0]; 
    days = [components day]; 
    hour = [components hour]; 
    minutes = [components minute]; 

    if (days > 0) { 

     if (days > 1) { 
      durationString = [NSString stringWithFormat:@"%d days", days]; 
     } 
     else { 
      durationString = [NSString stringWithFormat:@"%d day", days]; 
     } 
     return durationString; 
    } 

    if (hour > 0) { 

     if (hour > 1) { 
      durationString = [NSString stringWithFormat:@"%d hours", hour]; 
     } 
     else { 
      durationString = [NSString stringWithFormat:@"%d hour", hour]; 
     } 
     return durationString; 
    } 

    if (minutes > 0) { 

     if (minutes > 1) { 
      durationString = [NSString stringWithFormat:@"%d minutes", minutes]; 
     } 
     else { 
      durationString = [NSString stringWithFormat:@"%d minute", minutes]; 
     } 
     return durationString; 
    } 

    return @""; 
} 
+0

no muestra más de 12 horas de diferencia. si quiero verificar algunas condiciones a las 23 horas, ¿cómo puedo obtener 23 horas de diferencia entre las horas? – Moxarth

Cuestiones relacionadas