将秒格式化为hh:ii:ss

Mar*_*del 12 objective-c nsdateformatter

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

几小时,分钟,秒的NSNumber

我写了这段代码:

NSDate *date = [NSDate dateWithTimeIntervalSince1970:[[self meeting] elapsedSeconds]];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"hh:mm:ss"];
Run Code Online (Sandbox Code Playgroud)

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

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:[[self meeting] elapsedSeconds] * -1];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"hh:mm:ss"];
Run Code Online (Sandbox Code Playgroud)

认为它会正确显示计数器,但它确实是一个奇怪的01:23:00,然后只是翻到04:00:00并在其余时间停留在那里.

女士

dre*_*lax 51

这类似于之前关于格式化时间的答案,但不需要日期格式化程序,因为我们不再处理日期.

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

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

NSString *formattedTime = [NSString stringWithFormat:@"%u:%02u:%02u", h, m, s];
Run Code Online (Sandbox Code Playgroud)


lna*_*ger 7

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

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

[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
Run Code Online (Sandbox Code Playgroud)

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

[formatter setDateFormat:@"HH:mm:ss"];
Run Code Online (Sandbox Code Playgroud)

请记住,由于这是为了与时间一起工作,它将无法工作超过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
Run Code Online (Sandbox Code Playgroud)