103 votes

Comment calculer le temps en heures entre deux dates dans iOS

Comment calculer le temps écoulé en heures entre deux moments (pouvant survenir à des jours différents) dans iOS ?

1 votes

Une autre option consiste à utiliser NSCalendar 's -components:fromDate:toDate:options: método.

0 votes

Je ne pense pas que cela vous donnera un nombre absolu d'heures. Elle ne vous donnera qu'une valeur de 0 à 24, où vous devrez vous fier aux composants Jour, Mois et Année pour obtenir l'intervalle de temps complet.

0 votes

Je l'ai testé, et cela fonctionne parfaitement. Avec fromDate 1/Jan/2012 et toDate 4/Jan/2012, cela a donné 96 heures.

173voto

Akusete Points 4597

El NSDate fonction timeIntervalSinceDate : vous donnera la différence entre deux dates en secondes.

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

Voir, le bibliothèque de référence de la pomme http://developer.apple.com/library/mac/navigation/ ou si vous utilisez Xcode, sélectionnez simplement aide/documentation dans le menu.

Voir : comment-convertir-un-intervalle-de-temps-secondes-en-minutes

--edit : Voir La réponse de ÐrÐvil ci-dessous pour gérer correctement l'heure d'été et les secondes intercalaires.

2 votes

Et que se passe-t-il si les dates/heures croisent la transition pour l'heure d'été ?

2 votes

@Abizern : Merci, je n'envisageais pas ces cas lorsque j'ai répondu à la question. J'ai mis un lien vers la réponse de ÐrÐvil.

0 votes

J'ai un créneau horaire comme 4:50:30 , h:m:s je dois soustraire ce temps de 12:30:20 comment faire ?

91voto

ÐąrέÐέvil Points 1775
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

Changez les composants nécessaires en jour, heure ou minute, selon la différence que vous voulez. Si NSDayCalendarUnit est sélectionné, il renverra le nombre de jours entre deux dates, de la même manière que pour l'option NSHourCalendarUnit y NSMinuteCalendarUnit

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

0 votes

Quelle valeur dateWithTimeIntervalSince1970 accepte-t-elle ? Je crois que vous avez converti la date 2012-06-22 en 1340323201. Veuillez me corriger.

0 votes

Ne fonctionne pas pour moi. J'ai obtenu une valeur de différence de 9223372036854775807. Est-ce que c'est en millisecondes ?

0 votes

Swift 4.2. Au lieu de [.hour], vous pouvez utiliser Set<Calendar.Component>([.hour])

19voto

Ashish Patel Points 91
-(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 votes

Non, ne le faites pas. Toutes les heures n'ont pas 3600 secondes. Tous les jours n'ont pas 24 heures.

5 votes

C'est totalement faux. Il ne tient pas compte des secondes intercalaires, ni de l'heure d'été. S'il vous plaît, ne réinventez pas la roue, utilisez simplement les API fournies avec iOS comme NSDateComponents.

5voto

Ankish Jain Points 109

Checkout : Il prend en charge l'heure d'été, l'année bissextile car il utilise le calendrier iOS pour calculer. Vous pouvez changer la chaîne et les conditions pour inclure les minutes avec les heures et les jours.

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

4voto

john raja Points 171

Pour ceux qui utilisent swift 3 et plus,

    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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X