从两个 NSDate 计算完整经过的友好时间

Posted

技术标签:

【中文标题】从两个 NSDate 计算完整经过的友好时间【英文标题】:Calculate full elapsed friendly time from two NSDates 【发布时间】:2016-08-24 18:06:14 【问题描述】:

我正在尝试创建一种以以下格式计算全时的方法: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。 因为大多数 people recommend 没有完成我想要的。

更新用户 Rob 建议使用 NSDateComponentsFormatter

为了得到我想要的样式,这里是供将来使用的代码。这仅适用于 ios 8+

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

【问题讨论】:

拥有两个NSDate 对象后,使用NSDateComponentsFormatter 构建您的已用时间字符串。 那行不通。它吐出About 75 minutes remaining @Firemarble 您需要正确配置NSDateComponentsFormatter 以获得您想要的。 用您实际获得的输出与您期望获得的输出更新您的问题。顺便说一句 - 您的日期格式化程序中的格式错误。年份使用yyyy,而不是YYYY 优秀。不过,我建议您删除该编辑,而是发布您的问题的答案。见Can I answer my own question? 【参考方案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;

【讨论】:

您应该说明问题所在以及您的解决方案如何解决问题。此处不赞成仅使用代码的答案。

以上是关于从两个 NSDate 计算完整经过的友好时间的主要内容,如果未能解决你的问题,请参考以下文章

计算并显示两个 NSDate 之间的时间

计算两个日期的天数问题

在两个NSDate之间获得准确的时间差?

没有从 NSDate 获得正确的日期

计算两个日期之间的天数

比较两个NSDate类型的参数相差的时间差