Рассчитать полное прошедшее дружеское время из двух NSDates

Я пытаюсь создать метод, который рассчитывает полный рабочий день в формате:
0 Year 0 month 1 day 1 hour 15 minutes 5 seconds

Я передаю следующие две даты в качестве примеров. Который должен быть 1 час 15 минут и 5 секунд.

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

Способ сделать расчеты

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

Я просмотрел ТАК вопросы, но все они, кажется, выплевывают только 1 экземпляр. то есть 1 день назад, но не полная строка с остатками.

Что я делаю неправильно? Пожалуйста, никаких внешних каркасов Github или CocoaPods. Поскольку большинство людей рекомендует, не достигайте того, чего я хочу.

ОБНОВЛЕНИЕ Пользователь Роб предложил использовать NSDateComponentsFormatter

Чтобы получить стиль, который я хотел, вот код для будущего использования. Это работает только на iOS 8+

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

1 ответ

Я думаю, что ваша реализация метода расчета должна выглядеть примерно так:

- (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;
}
Другие вопросы по тегам