NSTimeInterval到HH:mm:ss?

fuz*_*oat 82 iphone cocoa-touch objective-c

如果我有一个设置为200.0的NSTimeInterval,有没有办法将其转换为00:03:20,我想我可以用它初始化NSDate然后使用NSDateFormatter使用HH:mm:ss.我的问题是,有一个快速的方法来做到这一点,还是我必须自己分解数字并使用[NSString stringWithFormat: %02d:%02d:%02d, myHour, myMin, mySec]

Mat*_*uch 193

NSDateFormatter除了除法和模数之外,不需要使用或其他任何东西.NSTimeInterval只是一个包含秒的双倍.

迅速

func stringFromTimeInterval(interval: NSTimeInterval) -> String {
    let interval = Int(interval)
    let seconds = interval % 60
    let minutes = (interval / 60) % 60
    let hours = (interval / 3600)
    return String(format: "%02d:%02d:%02d", hours, minutes, seconds)
}
Run Code Online (Sandbox Code Playgroud)

Objective-C的

- (NSString *)stringFromTimeInterval:(NSTimeInterval)interval {
    NSInteger ti = (NSInteger)interval;
    NSInteger seconds = ti % 60;
    NSInteger minutes = (ti / 60) % 60;
    NSInteger hours = (ti / 3600);
    return [NSString stringWithFormat:@"%02ld:%02ld:%02ld", (long)hours, (long)minutes, (long)seconds];
}
Run Code Online (Sandbox Code Playgroud)

  • 这是错误的答案,因为它没有本地化分隔符(正如其他评论所提到的).使用NSDateCompomentsFormatter,您可以在一行中正确格式化您的时间间隔,例如`NSDateComponentsFormatter().stringFromTimeInterval(NSTimeInterval(duration))`in swift (20认同)
  • 对于本地化和未来验证,正确的解决方案是使用@jrc描述的NSDateComponentsFormatter (4认同)

jrc*_*jrc 100

在iOS 8上,使用NSDateComponentsFormatter.

NSDateComponentsFormatter *dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init];
NSLog(@"%@", [dateComponentsFormatter stringFromTimeInterval:200.0]);
Run Code Online (Sandbox Code Playgroud)

输出"3:20".

NSDateComponentsFormatter *dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init];
dateComponentsFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;
dateComponentsFormatter.allowedUnits = (NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond);
NSLog(@"%@", [dateComponentsFormatter stringFromTimeInterval:200.0]);
Run Code Online (Sandbox Code Playgroud)

输出"0:03:20".

  • 不错的更新.但是,如果它真的只是这么简单的计算,那么就不会使用这些对象带来巨大的开销(只要不涉及动态格式)? (2认同)
  • 您需要格式以确保字符串正确显示不同的区域设置等. (2认同)

Sco*_*ner 16

Swift 3版本的onmyway133的答案:

import Foundation

func format(_ duration: TimeInterval) -> String {
    let formatter = DateComponentsFormatter()
    formatter.zeroFormattingBehavior = .pad
    formatter.allowedUnits = [.minute, .second]

    if duration >= 3600 {
        formatter.allowedUnits.insert(.hour)
    }

    return formatter.string(from: duration)!
}


print(format(12)) // 0:12
print(format(65)) // 1:05
print(format(1750)) // 29:10
print(format(3890)) // 1:04:50
print(format(45720)) // 12:42:00
Run Code Online (Sandbox Code Playgroud)


Ros*_*hit 10

一些额外的代码行,但我觉得使用NSDateComponents会给出更精确的值.

- (NSString *)getTimeRepresentationFromDate:(NSDate *)iDate withTimeInterval:(NSTimeInterval)iTimeInterval {
    NSString *aReturnValue = nil;
    NSDate *aNewDate = [iDate dateByAddingTimeInterval:iTimeInterval]; 

    unsigned int theUnits = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
    NSCalendar *aCalender = [NSCalendar currentCalendar];
    NSDateComponents *aDateComponents = [aCalender components:theUnits fromDate:iDate toDate:aNewDate options:0];

    aReturnValue = [NSString stringWithFormat:@"%d:%d:%d", [aDateComponents hour], [aDateComponents minute], [aDateComponents second]];

    return aReturnValue;
}
Run Code Online (Sandbox Code Playgroud)

  • 这比"matthias-bauch"使用的方法更"精确"? (2认同)

onm*_*133 8

Swift 2中,iOS 8+.这确保我们只在必要时显示小时

func format(duration: NSTimeInterval) -> String {
  let formatter = NSDateComponentsFormatter()
  formatter.zeroFormattingBehavior = .Pad

  if duration >= 3600 {
    formatter.allowedUnits = [.Hour, .Minute, .Second]
  } else {
    formatter.allowedUnits = [.Minute, .Second]
  }

  return formatter.stringFromTimeInterval(duration) ?? ""
}
Run Code Online (Sandbox Code Playgroud)

所以你有了

print(format(12)) // 0:12
print(format(65)) // 1:05
print(format(1750)) // 29:10
print(format(3890)) // 1:04:50
print(format(45720)) // 12:42:00
Run Code Online (Sandbox Code Playgroud)


Jak*_*kub 5

斯威夫特 4

DateComponentsFormatter().string(from: <# TimeInterval #>)
Run Code Online (Sandbox Code Playgroud)

前任:

DateComponentsFormatter().string(from: 59.0)
Run Code Online (Sandbox Code Playgroud)