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.