Cómo calcular el tiempo en horas entre dos fechas en iOS


103

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


1
Otra opción es utilizar NSCalendarel -components:fromDate:toDate:options:método de.
— Thomas Müller

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

Probé esto y funciona bien. Con fromDate 1 / Jan / 2012 y toDate 4 / Jan / 2012, esto devolvió 96 horas.
— Thomas Müller

publica tu código Thomas? No funciona para algunos.
— John Riselvato

Respuestas:


171

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;

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

Ver: cómo-convertir-un-n-tiempo-intervalo-segundos-en-minutos

--editar: Vea la respuesta de ÐąrέÐέvil a continuación para manejar correctamente el horario de verano / segundos bisiestos


2
¿Y qué sucede si las fechas / horas cruzan la transición del horario de verano?
— Abizern

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

tengo un intervalo de tiempo como 4:50:30, h: m: si tengo que restar este tiempo de 12:30:20 cómo haré esto
— AyAz

90
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

Cambie los componentes necesarios por día, hora o minuto, la diferencia que desee. Si NSDayCalendarUnitse selecciona, devolverá el número de días entre dos fechas de manera similar para NSHourCalendarUnityNSMinuteCalendarUnit

Versión Swift 4

let cal = Calendar.current
let d1 = Date()
let d2 = Date.init(timeIntervalSince1970: 1524787200) // April 27, 2018 12:00:00 AM
let components = cal.dateComponents([.hour], from: d2, to: d1)
let diff = components.hour!

¿Qué valor acepta dateWithTimeIntervalSince1970? Creo que ha convertido la fecha 2012-06-22 a 1340323201. Por favor corríjame.
— Jeet

No funciona para mi. El valor de la diferencia es 9223372036854775807. ¿Está en milisegundos?
— Kirti Nikam

Rápido 4.2. En lugar de [.hora] puede utilizar Establecer <Calendar.Component> ([. Hora])
— IvanPavliuk

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;
}

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

5
Esto está totalmente mal. No tiene en cuenta los segundos intercalares ni el horario de verano. No reinvente la rueda, solo use las API proporcionadas con iOS como NSDateComponents.
— Juan Catalán

5

Pago: Se encarga del horario de verano, año bisiesto, ya que usó el calendario de iOS para calcular. 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 @"";
}

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

Da un intervalo de tiempo incorrecto, no funciona para mí.
— Arvind Patel

3

Para aquellos que usan swift 3 y superior,

    let dateString1 = "2018-03-15T14:20:00.000Z"
    let dateString2 = "2018-03-20T14:20:00.000Z"

    let Dateformatter = DateFormatter()
    Dateformatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"

    let date1 = Dateformatter.date(from: dateString1)
    let date2 = Dateformatter.date(from: dateString2)

    let distanceBetweenDates: TimeInterval? = date2?.timeIntervalSince(date1!)
    let secondsInAnHour: Double = 3600
    let secondsInDays: Double = 86400
    let secondsInWeek: Double = 604800

    let hoursBetweenDates = Int((distanceBetweenDates! / secondsInAnHour))
    let daysBetweenDates = Int((distanceBetweenDates! / secondsInDays))
    let weekBetweenDates = Int((distanceBetweenDates! / secondsInWeek))

    print(weekBetweenDates,"weeks")//0 weeks
    print(daysBetweenDates,"days")//5 days
    print(hoursBetweenDates,"hours")//120 hours
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.