2016-08-24 1 views
0

Ich versuche, ein Verfahren zu schaffen, das im Format der Vollzeit berechnet. Was sollte 1 Stunde 15 Minuten und 5 Sekunden sein.Berechnen voll verstrichene Zeit freundlich von zwei NSDates

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

Verfahren die Berechnungen

- (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; 
} 

Ich habe blickte über SO quiestions zu tun, aber theyu alle scheinen nur 1 Instanz auszuspucken. also vor 1 Tag, aber nicht die ganze Zeichenfolge mit den Resten.

Was mache ich falsch? Bitte keine externen Github-Frameworks oder CocoaPods. Wie die meisten people recommend nicht erreichen, was ich will.

UPDATE Benutzer Rob vorgeschlagen mit NSDateComponentsFormatter

Um den Stil bekomme ich hier wollte der Code für die zukünftige Verwendung ist. Dies funktioniert nur auf iOS 8+

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

Sobald Sie Ihre zwei 'NSDate' Objekte haben, verwenden Sie' NSDateComponentsFormatter' Zeichenfolge zu bauen der verstrichenen Zeit. – Rob

+0

Das funktioniert nicht. Es spuckt aus 'Ungefähr 75 Minuten verbleibend' –

+1

@Firemarble Sie müssen 'NSDateComponentsFormatter' richtig konfigurieren, um zu bekommen, was Sie wollen. – rmaddy

Antwort

0

Ich denke, Ihre Berechnungsmethode Umsetzung so etwas wie dies sein sollte:

- (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

Sie sollten erklären, was falsch war und wie Ihre Lösung das Problem behebt. Code-only-Antworten sind hier verpönt. – rmaddy