2016-08-24 1 views
0

Je suis en train de créer une méthode qui calcule le temps plein dans le format de:
0 Year 0 month 1 day 1 hour 15 minutes 5 secondsCalculer le temps écoulé amical complet de deux NSDates

Je passe deux dates suivantes à titre d'exemples. Ce qui devrait être 1 heure 15 minutes et 5 secondes.

NSString * startDate = @"2016-08-24 10:00:00"; 
NSString * endDate = @"2016-08-24 11:15:05"; 
NSLog(@"Total Time: %@", [self caluculateTimeFrom:startDate endDate:endDate]); 

La méthode pour effectuer les calculs

- (NSString*) caluculateTimeFrom:(NSString*)startDate endDate:(NSString*)endDate { 

    NSLog(@"Start Date: %@", startDate); 
    NSLog(@"End Date: %@", endDate); 
    if (startDate == nil || endDate == nil) { 
     return nil; 
    } 


    NSString * returnDate = @""; 

    NSDateFormatter *dateFormater = [[NSDateFormatter alloc] init]; 
    [dateFormater setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; 

    NSDate * date1 = [dateFormater dateFromString:startDate]; 
    NSDate * date2 = [dateFormater dateFromString:endDate]; 

    float totalElapsedSeconds = roundf([date2 timeIntervalSinceDate:date1]); 
    NSLog(@"totalElapsedTime: %f", totalElapsedSeconds); 

    if (totalElapsedSeconds < SECOND) { 
     returnDate = @"0 seconds"; 
     return returnDate; 
    } 

    float days = totalElapsedSeconds/(60 * 60 * 24); 
    totalElapsedSeconds -= days * (60 * 60 * 24); 
    float hours = totalElapsedSeconds/(60 * 60); 
    totalElapsedSeconds -= hours * (60 * 60); 
    float minutes = totalElapsedSeconds/60; 

    returnDate = [NSString stringWithFormat:@"%f days %f hours %f minutes", days, hours, minutes]; 


    return returnDate; 
} 

J'ai regardé par-dessus SO quiestions mais theyu tous semblent cracher que par exemple 1. c'est à dire il y a 1 jour mais pas la chaîne complète avec les restes.

Qu'est-ce que je fais mal? Veuillez ne pas utiliser de frameworks Github externes ou de CocoaPods. Comme les plus people recommend ne pas accomplir ce que je veux.

ACTUALISATION utilisateur Rob a suggéré d'utiliserNSDateComponentsFormatter

Pour obtenir le style que je voulais ici est le code pour une utilisation future. Cela ne fonctionne que sur iOS 8+

NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init]; 
    formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleFull; 
    formatter.allowedUnits = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; 
+2

Une fois que vous avez vos deux objets 'NSDate', utilisez' NSDateComponentsFormatter' pour construire votre chaîne du temps écoulé. – Rob

+0

Cela ne fonctionne pas. Il crache 'Environ 75 minutes restantes' –

+1

@Firemarble Vous devez configurer le' NSDateComponentsFormatter' correctement pour obtenir ce que vous voulez. – rmaddy

Répondre

0

Je pense que votre implémentation de la méthode de calcul doit être quelque chose comme ceci:

- (NSString *)caluculateTimeFrom:(NSString*)startDate endDate:(NSString*)endDate 
{ 
    NSDateFormatter *formatter = [NSDateFormatter new]; 
    [formatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; 

    NSDate *date1 = [formatter dateFromString:startDate]; 
    NSDate *date2 = [formatter dateFromString:endDate]; 

    NSTimeInterval interval = [date2 timeIntervalSinceDate:date1]; 

    NSCalendarUnit units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; 
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
    NSDateComponents *components = [calendar components:units 
               fromDate:[NSDate date]]; 
    [components setYear:1]; 
    [components setMonth:1]; 
    [components setDay:1]; 
    [components setHour:0]; 
    [components setMinute:0]; 
    [components setSecond:0]; 

    NSDate *zeroDate = [calendar dateFromComponents:components]; 
    NSDate *date = [NSDate dateWithTimeInterval:interval sinceDate:zeroDate]; 

    components = [calendar components:units 
          fromDate:date]; 
    NSString *result = [NSString stringWithFormat:@"%ld Year %ld month %ld day %ld hour %ld minutes %ld seconds", components.year - 1, 
         components.month - 1, 
         components.day - 1, 
         components.hour, 
         components.minute, 
         components.second]; 

    return result; 
} 
+0

Vous devez expliquer ce qui ne va pas et comment votre solution résout le problème. Les réponses au code seulement sont mal vues ici. – rmaddy