将秒格式化为hh:ii:ss

时间:2010-10-28 20:37:59

标签: objective-c nsdateformatter

我有app是一个基本的计时器。它跟踪应用程序运行的秒数。我想转换它所以秒(NSUInteger)显示如下:00:00:12(hh:mm:ss)。所以我读过这篇文章:

NSNumber of seconds to Hours, minutes, seconds

我写了这段代码:

NSDate *date = [NSDate dateWithTimeIntervalSince1970:[[self meeting] elapsedSeconds]];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"hh:mm:ss"];

它工作正常,但它从04:00:00开始。我不知道为什么。我也尝试过这样的事情:

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:[[self meeting] elapsedSeconds] * -1];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"hh:mm:ss"];

认为它会正确地显示计数器,但它在01:23:00变得很奇怪,然后只是翻到04:00:00并在其余时间停留在那里。

MS

2 个答案:

答案 0 :(得分:50)

这类似于关于格式化时间的previous answer,但不需要日期格式化程序,因为我们不再处理日期了。

如果您将整数秒存储为整数,则可以自行计算各个时间组件:

NSUInteger h = elapsedSeconds / 3600;
NSUInteger m = (elapsedSeconds / 60) % 60;
NSUInteger s = elapsedSeconds % 60;

NSString *formattedTime = [NSString stringWithFormat:@"%u:%02u:%02u", h, m, s];

答案 1 :(得分:7)

虽然有更简单的方法可以做到这一点(@dreamlax有一个非常好的方法),让我解释你的例子有什么问题,让它让它运作起来:

首先,它显示04:00:00(好吧,实际上可能显示04:00:12)的原因是因为它将时间从UTC / GMT转换为当地时间。要解决此问题,您需要添加以下行:

[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

然后,它将不再显示04:00:12,因为它不会转换时区。不幸的是,它现在会显示12:00:12而不是00:00:12,因为它是午夜。为了解决这个问题,请将字符串转换为24小时,而不是使用HH格式化程序而不是hh

[formatter setDateFormat:@"HH:mm:ss"];

请记住,由于这是为了与时间一起工作,因此它将无法工作超过24小时(因为它将“再次”翻转到午夜)。

完整的代码是:

NSDate *date = [NSDate dateWithTimeIntervalSince1970:[[self meeting] elapsedSeconds]];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"HH:mm:ss"];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSLog(@"%@", [formatter stringFromDate:date]);
// Results:  00:00:12