Comment calculer le temps en heures entre deux dates dans iOS

103

Comment puis-je calculer le temps écoulé en heures entre deux heures (éventuellement survenant à des jours différents) dans iOS?

iosrookie
la source
1
Une autre option consiste à utiliser NSCalendarla -components:fromDate:toDate:options:méthode de.
Thomas Müller
Je ne crois pas que cela vous donnera un nombre absolu d'heures. Il ne vous donnera qu'une valeur comprise entre 0 et 24, où vous devrez vous fier aux composants Jour, Mois et Année pour obtenir l'intervalle de temps complet.
codeperson
J'ai testé cela et cela fonctionne très bien. Du 1er janvier 2012 au 4 janvier 2012, cela a retourné 96 heures.
Thomas Müller
postez votre code Thomas? Cela ne fonctionne pas pour certains.
John Riselvato

Réponses:

171

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

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

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

Voir: comment-convertir-un-nstimeinterval-secondes-en-minutes

--edit: Voir la réponse de ÐąrέÐέvil ci-dessous pour gérer correctement l'heure d'été / secondes intercalaires

Akusete
la source
2
Et que se passe-t-il si les dates / heures traversent la transition pour l'heure d'été?
Abizern
2
@Abizern: Merci, je ne considérais pas ces cas quand j'ai répondu à la question. J'ai lié à la réponse par ÐąrέÐέvil
Akusete
J'ai un créneau horaire comme 4:50:30, h: m: si je dois soustraire cette heure de 12:30:20 comment je vais le faire
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

Changez les composants nécessaires en jour, heure ou minute, quelle différence vous voulez. Si NSDayCalendarUnitest sélectionné, il renverra le nombre de jours entre deux dates de la même manière pour NSHourCalendarUnitetNSMinuteCalendarUnit

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!
aahsanali
la source
Quelle valeur dateWithTimeIntervalSince1970 accepter? Je crois que vous avez converti la date du 22/06/2012 en 1340323201. Veuillez me corriger.
Jeet
Ne travaille pas pour moi. Vous avez une valeur de diff comme 9223372036854775807. Est-ce en millisecondes?
Kirti Nikam
Swift 4.2. Au lieu de [.hour], vous pouvez utiliser 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;
}
Ashish Patel
la source
9
Non, ne fais pas ça. Toutes les heures ne comptent pas 3600 secondes. Tous les jours n'ont pas 24 heures.
rmaddy
5
C'est totalement faux. Ne tient pas compte des secondes intercalaires, des économies d'heure d'été. Veuillez ne pas réinventer la roue, utilisez simplement les API fournies avec iOS comme NSDateComponents.
Juan Catalan
5

Caisse: Il prend en charge l'heure d'été, année bissextile, car il utilise le calendrier iOS pour calculer. Vous pouvez modifier la chaîne et les conditions pour inclure des minutes avec des heures et des 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 @"";
}
Ankish Jain
la source
il ne montre pas plus de 12 heures de différence. si je veux vérifier certaines conditions à 23 heures, comment obtenir 23 heures de différence entre les heures?
Moxarth
Cela donne un mauvais intervalle de temps, ne fonctionne pas pour moi.
Arvind Patel
3

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
john raja
la source