NSTimeInterval to HH:mm:ss?

后端 未结 12 1768
陌清茗
陌清茗 2020-12-04 08:53

If I have an NSTimeInterval that is set to say 200.0, is there a way to convert that into 00:03:20, I was thinking I could initialise an NSDate with it and then use NSDateFo

相关标签:
12条回答
  • 2020-12-04 09:39

    On iOS 8, use NSDateComponentsFormatter.

    NSDateComponentsFormatter *dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init];
    NSLog(@"%@", [dateComponentsFormatter stringFromTimeInterval:200.0]);
    

    outputs "3:20".

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

    outputs "0:03:20".

    0 讨论(0)
  • 2020-12-04 09:39

    Swift 3 version of onmyway133's answer:

    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
    
    0 讨论(0)
  • 2020-12-04 09:39

    In Swift 2, iOS 8+. This makes sure we only show hour when necessary

    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) ?? ""
    }
    

    So you have

    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
    
    0 讨论(0)
  • 2020-12-04 09:40

    No need to use NSDateFormatter or anything else than division and modulo. NSTimeInterval is just a double containing seconds.

    Swift

    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)
    }
    

    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];
    }
    
    0 讨论(0)
  • 2020-12-04 09:42

    Based on answer by @onmyway133 here is the Swift 4 version:

    func format(duration: TimeInterval) -> String {
        let formatter = DateComponentsFormatter()
        formatter.zeroFormattingBehavior = .pad
    
        if duration >= 3600 {
            formatter.allowedUnits = [.hour, .minute, .second];
        } else {
            formatter.allowedUnits = [.minute, .second];
        }
    
        return formatter.string(from: duration) ?? "";
    }
    
    0 讨论(0)
  • 2020-12-04 09:42

    straight from apple docs: in h file:

     @property(strong,nonatomic)NSDateComponentsFormatter *timerFormatter;
    

    in m file

    @synthesize timerFormatter;
    
    - (void)viewDidLoad {
    [super viewDidLoad];
    NSDateComponentsFormatter *timerFormatter = [[NSDateComponentsFormatter alloc] init];
    timerFormatter.unitsStyle = NSDateComponentsFormatterUnitsStylePositional; 
    //10:59 Positional THIS ONE DOES NOT SEEM TO WORK iOS<9 WHEN <1Minute JUST SHOWS 01, 10m 59s Abbreviated, 10min 59sec Short, 10minutes 59seconds Full ...
    timerFormatter.allowedUnits = NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;
    }
    

    whereever you need to convert your NSTimeInterval timeInterval to hh:mm:ss string, do this:

    NSString *txt=[timerFormatter stringFromTimeInterval:timeInterval];
    
    0 讨论(0)
提交回复
热议问题