以秒、分钟、小时为单位的经过时间
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 秒(秒)