Come calcolare il tempo in ore tra due date in iOS


103

Come posso calcolare il tempo trascorso in ore tra due volte (possibilmente in giorni diversi) in iOS?


1
Un'altra opzione è usare NSCalendaril -components:fromDate:toDate:options:metodo di.
— Thomas Müller

Non credo che questo ti darà un numero assoluto di ore. Ti darà solo un valore compreso tra 0 e 24, in cui devi fare affidamento sui componenti Giorno, Mese e Anno per ottenere l'intervallo di tempo pieno.
— codeperson

L'ho provato e funziona benissimo. Con dalla data 1 / gen / 2012 e fino alla data 4 / gen / 2012 questo ha restituito 96 ore.
— Thomas Müller

inserisci il tuo codice Thomas? Non funziona per alcuni.
— Giovanni Riselvato

Risposte:


171

La NSDate funzione di timeIntervalSinceDate: vi darà la differenza di due date in secondi.

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

Vedi, la libreria di riferimento Apple http://developer.apple.com/library/mac/navigation/ o se stai usando Xcode seleziona semplicemente help / documentation dal menu.

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

--edit: Vedi la risposta di ÐąrέÐέvil di seguito per gestire correttamente l'ora legale / i secondi intercalari


2
E cosa succede se le date / orari attraversano la transizione per l'ora legale?
— Abizern

2
@ Abizern: Grazie, non stavo considerando quei casi quando ho risposto alla domanda. Ho collegato la risposta di ÐąrέÐέvil
— Akusete

ho un intervallo di tempo come 4:50:30, h: m: si devo sottrarre questo tempo da 12:30:20 come lo farò
— 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

Cambia i componenti necessari in giorno, ora o minuto, quale differenza desideri. Se NSDayCalendarUnitè selezionato, restituirà il numero di giorni tra due date in modo simile per NSHourCalendarUniteNSMinuteCalendarUnit

Versione 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!

Quale valuta dateWithTimeIntervalSince1970 accetta? credo che tu abbia convertito la data del 22/06/2012 a 1340323201. per favore correggimi.
— Jeet

Non funziona per me. È stato ottenuto un valore diff come 9223372036854775807. È in millisecondi?
— Kirti Nikam

Swift 4.2. Invece di [.hour] puoi usare Set <Calendar.Component> ([. Hour])
— 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, non farlo. Non tutte le ore hanno 3600 secondi. Non tutti i giorni hanno 24 ore.
— rmaddy

5
Questo è totalmente sbagliato. Non tiene conto dei secondi intercalari e dell'ora legale. Per favore, non reinventare la ruota, usa solo le API fornite con iOS come NSDateComponents.
— Juan Catalan

5

Checkout: si prende cura dell'ora legale e dell'anno bisestile poiché utilizzava il calendario iOS per calcolare. È possibile modificare la stringa e le condizioni per includere minuti con ore e giorni.

+(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 @"";
}

non mostra più di 12 ore di differenza. se voglio controllare alcune condizioni alle 23 ore, come ottenere 23 ore di differenza tra gli orari?
— Moxarth

Dà un intervallo di tempo sbagliato, non funziona per me.
— Arvind Patel il

3

Per coloro che utilizzano swift 3 e versioni successive,

    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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.