framework español iphone objective-c cocoa-touch

iphone - español - NSTimeInterval a HH: mm: ss?



cocoa touch español (10)

Si tengo un NSTimeInterval que está configurado para decir 200.0, ¿hay alguna manera de convertir eso en 00:03:20, estaba pensando que podría inicializar un NSDate con él y luego usar NSDateFormatter usando HH: mm: ss. Mi pregunta es, ¿hay una forma rápida de hacerlo o tengo que dividir el número yo mismo y usar [NSString stringWithFormat: %02d:%02d:%02d, myHour, myMin, mySec] ?


Algunas líneas adicionales de código, pero creo que usar NSDateComponents dará un valor más preciso.

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


En Swift 2 , iOS 8+ . Esto asegura que solo mostramos la hora cuando sea necesario

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

Así que tienes

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


En iOS 8, use NSDateComponentsFormatter .

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

salidas "3:20".

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

salidas "0:03:20".


No es necesario usar NSDateFormatter ni nada que no sea división y módulo. NSTimeInterval es solo un doble que contiene segundos.

Rápido

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

C objetivo

- (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]; }


Para "extender" la sugerencia de Matthias Bauch, en Swift haría de esto una propiedad computada de NSTimeInterval:

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

La ventaja de esto es que está conectado al tipo NSTimeInterval , no a su controlador de vista ni a ningún otro lugar donde ponga esa función. Para usar irías algo como:

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


Según la respuesta de @onmyway133 aquí está la versión de Swift 4:

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


Supongo que la fracción del temporizador debería estar cerrada. Como el código de Matthias estaba creando ese problema en segundos, uso lo siguiente ligeramente modificado del de Matthias

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


directamente de los documentos de apple: en el archivo h:

@property(strong,nonatomic)NSDateComponentsFormatter *timerFormatter;

en m archivo

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

Donde sea que necesite convertir su NSTimeInterval timeInterval a hh: mm: ss, haga esto:

NSString *txt=[timerFormatter stringFromTimeInterval:timeInterval];


Swift 3 versión de la respuesta de 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


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