NSTimeInterval 到小时和分钟的错误转换

Posted

技术标签:

【中文标题】NSTimeInterval 到小时和分钟的错误转换【英文标题】:Wrong conversion of NSTimeInterval to hours and minutes 【发布时间】: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)。

知道为什么会这样吗?

谢谢!

【问题讨论】:

【参考方案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 是正确的,但我必须确保以小时和分钟为单位显示的结果完全正确,没有计算错误的机会。如果你能确认确实如此,那么简单的算术就可以解决我的问题

以上是关于NSTimeInterval 到小时和分钟的错误转换的主要内容,如果未能解决你的问题,请参考以下文章

舍入一个 NSTimeInterval 对象的值

swift 从NSTimeInterval转换为swift中的小时,分​​钟,秒,毫秒 - 来自http://stackoverflow.com/questions/28872450/conversi

如何以毫秒精度比较两次?

24小时采样差几分钟

php 将时间转成多少分钟/小时/天/前

将分钟转换为小时时出现奇怪的错误