NSTimeInterval à HH: mm: ss?

Si j’ai un NSTimeInterval configuré pour dire 200.0, y a-t-il un moyen de le convertir en 00:03:20, je pensais pouvoir initialiser un NSDate avec lui et ensuite utiliser NSDateFormatter en utilisant HH: mm: ss. Ma question est la suivante: existe-t-il un moyen rapide de le faire ou dois-je diviser le numéro moi-même et utiliser [NSSsortingng ssortingngWithFormat: %02d:%02d:%02d, myHour, myMin, mySec] ?

Pas besoin d’utiliser NSDateFormatter ou autre chose que la division et le modulo. NSTimeInterval est juste un double contenant des secondes.

Rapide

 func ssortingngFromTimeInterval(interval: NSTimeInterval) -> Ssortingng { let interval = Int(interval) let seconds = interval % 60 let minutes = (interval / 60) % 60 let hours = (interval / 3600) return Ssortingng(format: "%02d:%02d:%02d", hours, minutes, seconds) } 

Objectif c

 - (NSSsortingng *)ssortingngFromTimeInterval:(NSTimeInterval)interval { NSInteger ti = (NSInteger)interval; NSInteger seconds = ti % 60; NSInteger minutes = (ti / 60) % 60; NSInteger hours = (ti / 3600); return [NSSsortingng ssortingngWithFormat:@"%02ld:%02ld:%02ld", (long)hours, (long)minutes, (long)seconds]; } 

Sur iOS 8, utilisez NSDateComponentsFormatter .

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

sorties “3:20”.

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

sorties “0:03:20”.

Swift 3 version de la réponse de onmyway133 :

 import Foundation func format(_ duration: TimeInterval) -> Ssortingng { let formatter = DateComponentsFormatter() formatter.zeroFormattingBehavior = .pad formatter.allowedUnits = [.minute, .second] if duration >= 3600 { formatter.allowedUnits.insert(.hour) } return formatter.ssortingng(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 

Certaines lignes de code supplémentaires, mais je pense que l’utilisation de NSDateComponents donnera une valeur plus précise.

 - (NSSsortingng *)getTimeRepresentationFromDate:(NSDate *)iDate withTimeInterval:(NSTimeInterval)iTimeInterval { NSSsortingng *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 = [NSSsortingng ssortingngWithFormat:@"%d:%d:%d", [aDateComponents hour], [aDateComponents minute], [aDateComponents second]]; return aReturnValue; } 

Dans Swift 2 , iOS 8+ . Cela garantit que nous ne montrons que les heures lorsque cela est nécessaire

 func format(duration: NSTimeInterval) -> Ssortingng { let formatter = NSDateComponentsFormatter() formatter.zeroFormattingBehavior = .Pad if duration >= 3600 { formatter.allowedUnits = [.Hour, .Minute, .Second] } else { formatter.allowedUnits = [.Minute, .Second] } return formatter.ssortingngFromTimeInterval(duration) ?? "" } 

Donc vous avez

 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 
 NSTimeInterval ti = 3667; double hours = floor(ti / 60 / 60); double minutes = floor((ti - (hours * 60 * 60)) / 60); double seconds = floor(ti - (hours * 60 * 60) - (minutes * 60)); 

Pour “étendre” la suggestion de Matthias Bauch, dans Swift, je voudrais en faire une propriété calculée de NSTimeInterval:

 extension NSTimeInterval { var ssortingngValue: Ssortingng { let interval = Int(self) let seconds = interval % 60 let minutes = (interval / 60) % 60 let hours = (interval / 3600) return Ssortingng(format: "%02d:%02d:%02d", hours, minutes, seconds) } } 

L’avantage de ceci est qu’il est attaché au type NSTimeInterval , pas à votre contrôleur de vue ou partout où vous mettez cette fonction. Pour utiliser vous irez quelque chose comme:

 let timeInterval = NSDate().timeIntervalSinceDate(start) self.elapsedTimeLabel.text = timeInterval.ssortingngValue 

Basé sur la réponse de @ onmyway133, voici la version Swift 4:

 func format(duration: TimeInterval) -> Ssortingng { let formatter = DateComponentsFormatter() formatter.zeroFormattingBehavior = .pad if duration >= 3600 { formatter.allowedUnits = [.hour, .minute, .second]; } else { formatter.allowedUnits = [.minute, .second]; } return formatter.ssortingng(from: duration) ?? ""; } 

directement à partir d’Apple Docs: dans le fichier h:

  @property(strong,nonatomic)NSDateComponentsFormatter *timerFormatter; 

dans le fichier m

 @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; } 

où que vous deviez convertir votre NSTimeInterval timeInterval en hh: mm: ss, faites ceci:

 NSSsortingng *txt=[timerFormatter ssortingngFromTimeInterval:timeInterval]; 

Je suppose que la fraction de minuteur devrait être plafonnée. Comme le code de Matthias créait ce problème en quelques secondes, j’utilise le texte légèrement modifié par rapport à celui de Matthias.

  - (NSSsortingng *)ssortingngFromTimeInterval:(NSTimeInterval)interval { int ti = (int) ceil(interval); int seconds = ti % 60; int minutes = (ti / 60) % 60; int hours = (ti / 3600); return [NSSsortingng ssortingngWithFormat:@"%02d:%02d:%02d",hours, minutes, seconds]; }