以秒、分钟、小时为单位的经过时间

Posted

技术标签:

【中文标题】以秒、分钟、小时为单位的经过时间【英文标题】:Elapsed time in seconds, minutes, hours 【发布时间】:2014-07-06 20:54:21 【问题描述】:

我想在UILabel 中显示经过的时间,如下所示:

 x sec | when the elapsed time is less than a minute compared to now 
 y minutes | when the elapsed time is less than a hour, but greater than 60 sec compared to now
 z hours | when the elapsed time is greater than 60 sec and 60 minutes, but less than 24 hours +1 seconds compared to now

我可以成功地捕捉到经过的时间,但我认为这是一种不同的格式,因为它按我想要的方式计算秒数和分钟数。它像这样显示经过的时间:-9 min -5 hours -10 seconds。为了使我的解决方案工作,我需要像这样的秒和分钟格式-120 sec,如果是 2 分钟前或-120 min,如果是 2 小时前,-48 hours,如果是两天前。

我认为这个解决方案可能很好,但是我每次都显示错误的整数。如果有人能给我一些指导,我将不胜感激,我该如何解决分秒问题。但是,如果有人过去做过类似的事情并且知道更好的方法(或者这是一种不好的方法),我也会尝试一下。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM/dd/yy HH:mm:ss"];

NSDate *dateFromString = [[NSDate alloc] init];
dateFromString = [dateFormatter dateFromString:self.fromDate];

NSTimeInterval timeInterval = [dateFromString timeIntervalSinceNow];

NSCalendar *deviceCalendar = [NSCalendar currentCalendar];


NSDate *date1 = [[NSDate alloc] init];
NSDate *date2 = [[NSDate alloc] initWithTimeInterval:timeInterval sinceDate:date1];

unsigned int unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;


NSDateComponents *conversionInfo = [deviceCalendar components:unitFlags fromDate:date1  toDate:date2  options:0];

NSLog(@" %d min %d hours %d seconds",[conversionInfo minute], [conversionInfo hour], [conversionInfo second]);

if ([conversionInfo second] < 60 || [conversionInfo minute] < 0 || [conversionInfo hour] < 0)

    NSString *secondString = [NSString stringWithFormat:@"%d",[conversionInfo second]];
    cell.time.text = secondString;



if ([conversionInfo second] > 60 || [conversionInfo minute] <= 60  || [conversionInfo hour] < 0)

    NSString *minuteString = [NSString stringWithFormat:@"%d",[conversionInfo minute]];
    cell.time.text = minuteString;



if ([conversionInfo second] > 60 || [conversionInfo minute] > 60 || [conversionInfo hour] >= 1)

    NSString *hourString = [NSString stringWithFormat:@"%d",[conversionInfo hour]];
    cell.time.text = hourString;


【问题讨论】:

不明白。请澄清你的问题:) 【参考方案1】:

NSDateComponent 将始终将您的日期分成这些部分。所以想想你的日期是 31.3.2014 15:08:12 然后NSDateComponent 会送你:

 day: 31
 month: 3
 year: 2014
 hours: 15
 minutes:8
 seconds:12

如果您有差异,这些值可能是负数,但 [NSDateComponent second] 例如仍然只是时差的秒部分,而不是秒格式的整个时差。因此,如果我有 -4 分 -3 秒的时差,[NSDateComponent second] 将是 -3,[NSDateComponent minute] 将是 -4。

因此,如果您想要自己描述经过的时间,您可以使用 NSDate 的 timeIntervalSince1970 方法并直接比较 UNIX 时间戳并计算所需的格式,或者您使用 NSDateComponent 并检查规则。所以如果没有小时,但 x 分钟..您经过的时间(以秒为单位)是:numberOfMinutes * 60 + numberOfSeconds 其中 numberOfminutes 是您的 [NSDateComponent minute] 和 numberOfSeconds 是您的 [NSDateComponent second]

所以我建议您检查以下伪代码顺序:

if (days > 0) 
   elapsed = hour + minutes/60 + seconds / 3600;
 else if (hour > 0) 
   elapsed = hour*60 + minutes + seconds / 60;
 else if (minute>0) 

等等..

//免责声明:不保证提供的样本计算的正确性

【讨论】:

我认为这样的事情会起作用,我在阅读您的答案时也有一个想法。如果我先检查小时可能会起作用,如果它小于 1 我检查分钟,如果它小于 1 分钟我可以显示秒等等.. 我更新了我的答案,您还可以看到它如何处理负值。因为您还需要确保您的 if 语句检查正确的东西,如 jazeee 提到的。因为如果我期望小时为 0 我们的负值,检查小时 > 0 没有意义.. 那么当然我需要检查小时 【参考方案2】:

根据您的描述,每个值,秒,分钟和小时都是负数。 这意味着您的比较不正确。 换句话说,您应该在 if 语句中使用绝对值,或者您应该更改您的 if 语句以匹配您的预期值。

编辑: 如果您将持续时间更改为正数,您的代码可能更容易处理,然后只需在格式化结果中放置一个负号。 换言之,如果conversionInfo 始终为负数,则切换date1 和date2。 然后在格式化字符串的时候,在前面加一个减号。

【讨论】:

由于他的描述,他希望他们是负面的。 我认为,根据代码和描述,conversionInfo 将始终为负数,因此第一个和第二个 if 语句将始终为真。第三个 if 语句总是错误的。我不认为那是意图。 (为什么要验证一个负数小于 60,因为它总是正确的。)我怀疑逻辑是倒退的。 啊,现在我明白了你的意思。是的,这似乎是错误的,尽管可以进一步简化逻辑以实现更好的可读性。 同意。此外,他们可以切换 date1 和 date2,然后根据需要进行格式化。 是的会更方便,因为您将差异视为正值而不是负值。

以上是关于以秒、分钟、小时为单位的经过时间的主要内容,如果未能解决你的问题,请参考以下文章

给定熊猫中只有小时-分钟-秒格式的列,如何以秒为单位返回总时间? [关闭]

如何获得以秒或分钟或小时为单位的时差? [复制]

以秒为单位将时间间隔格式化为 X 小时(秒) Y 分钟(秒) Z 秒(秒)

获取自 Linux 上的 Epoch、Bash 以来的当前时间(以秒为单位)

如何在 Swift3 中以秒为单位将字符串更改为分钟?

使用适当的 tm_mday 将两个 time_t 之间的差异转换为 tm