【问题标题】:Wrong conversion of NSTimeInterval to hours and minutesNSTimeInterval 到小时和分钟的错误转换
【发布时间】:2015-09-14 16:32:42
【问题描述】:

我正在构建一个应用程序,而部分逻辑是总结大量 NSTimeIntervals 并将结果转换为小时和分钟。

我正在使用 for 循环来添加间隔

NSTimeInterval totalInterval = 0;
for (MyObject *currentObject in _myList)
{
    totalInterval += [currentObject.endDate timeIntervalSinceDate:currentObject.startDate];
}

这个函数将返回一个 NSDateComponents 类型的对象:

// Get conversion to months, days, hours, minutes
unsigned int unitFlags = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitDay | NSCalendarUnitMonth;

NSDate *startDate = [self dateByOmittingSeconds:[NSDate date]]; // get the current time
NSDate *endDate = [[NSDate alloc] initWithTimeInterval:totalInterval sinceDate:startDate];

return [[NSCalendar currentCalendar] components:unitFlags fromDate:startDate  toDate:endDate  options:0];

然后我将其格式化为更易读的类型(NSString)供用户阅读:

- (NSString *)timeFormatted:(NSDateComponents *)workhours
{
    return [NSString stringWithFormat:@"%ldh %ldm", (long)[workhours hour], (long)[workhours minute]];
}

但是timeFormatted函数的结果输出14h 11m,而totalInterval中的秒数是正确的(137460s)。

知道为什么会这样吗?

谢谢!

【问题讨论】:

    标签: ios objective-c nsdate nsdatecomponents


    【解决方案1】:

    没有理由为此使用NSDateNSDateComponents

    NSTimeInterval 是秒数。简单的数学计算得出小时、分钟和秒。

    NSInteger hours = totalInterval / 3600;
    NSInteger minutes = totalInterval / 60 % 60;
    NSInteger seconds = totalInterval % 60;
    

    【讨论】:

    • 之前尝试过这样算术,但遇到了问题,它可以显示 8:58 而不是 8:59 等。你认为这是最好的解决方案吗?记住没有 NSNumbers 的算术可能不准确?
    • totalInterval 是带有小数秒的double。也许您可以在得到小时、分钟和秒之前舍入totalInterval。如果您不想要秒,请根据需要调整到最接近的分钟。
    • 我已经进行了调整,以便存储在我的应用程序中的每个 NSDate 将只包含小时和分钟,没有秒或纳秒。它必须是 100% 准确的小时和分钟间隔,绝对没有错误。
    • 问题是关于将totalInterval 转换为小时和分钟。你是说totalInterval 不正确吗?这是一个完全不同的问题/问题。
    • totalInterval 是正确的,但我必须确保以小时和分钟为单位显示的结果完全正确,没有计算错误的机会。如果你能确认确实如此,那么简单的算术就可以解决我的问题
    猜你喜欢
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2019-01-05
    相关资源
    最近更新 更多