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]
?NSTimeInterval a HH: mm: ss?
Respuesta
No es necesario utilizar NSDateFormatter
ni nada que no sea división y módulo. NSTimeInterval
es solo un doble que contiene segundos.
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];
}
Algunas líneas adicionales de código, pero me siento utilizando 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;
}
El método anterior usa las 2 fechas con las cuales se crea TimeInterval. También puede pasar [NSDate date] al parámetro iDate como valor predeterminado. – Roshit
¿De qué manera es esto "más preciso" que el método utilizado por @ matthias-bauch? –
con este método obtienes un intervalo de tiempo en segundos, horas, min. En términos de 60 mientras que la respuesta de @ matthias-bauch te da en términos decimales, por ejemplo si esperas suficiente tiempo verás 1 min 79 seg en vez de 2 min 19 seg –
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));
En iOS 8, utilice 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]);
salidas "0:03:20".
Nice update. Pero si realmente se trata de un cálculo tan simple, ¿no estaría utilizando estos objetos una gran sobrecarga (siempre que no haya un formato dinámico involucrado)? –
necesita el formato para asegurarse de que la cadena aparece correctamente para las diferentes configuraciones regionales, etc. –
Comentario realmente minúsculo, pero es extraño dar un ejemplo de la función C para la pregunta de ObjectiveC. ¿Vale la pena cambiarlo al formato ObjectiveC? – Rilakkuma
para "extender" la sugerencia de Matthias Bauch, en Swift Me gustaría hacer de esto una propiedad calculada 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á asociado con el tipo NSTimeInterval
, no su controlador de vista o cualquier otro lugar pones esa función. Para utilizar usted iría algo como:
let timeInterval = NSDate().timeIntervalSinceDate(start)
self.elapsedTimeLabel.text = timeInterval.stringValue
¡Gracias, Kenny! En mi caso los necesitaba por separado, así que agregué variables adicionales a su extensión: "var seconds: Int {let interval = Int (self); let seconds = interval% 60; return seconds}" y así sucesivamente durante minutos y horas. Entonces ese uso será: print ("minutes spent: \ (timeInterval.minutes)") – Vitalii
En Swift 2, iOS 8+.Esto se asegura de que sólo muestran horas 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 tienen
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
Swift versión 3 de respuesta onmyway133 's:
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
¿Está creando un DateComponentsFormatter costoso en cuanto a rendimiento, como un DateFormatter o NumberFormatter? – Moshe
Sobre la base de 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) ?? "";
}
directamente de documentos de manzana: 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;
}
dondequiera que usted necesita para convertir su NSTimeInterval timeInterval a hh: mm: cadena ss, hacer esto :
NSString *txt=[timerFormatter stringFromTimeInterval:timeInterval];
Supongo que la fracción del temporizador debe ser superada. Como código de Matthias estaba creando ese tema en cuestión de segundos, me utilizar los siguientes ligeramente modificado respecto a las 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];
}
- 1. Convertir TimeSpan de formato "hh: mm: ss" a "hh: mm"
- 2. Usando un NSTimer para HH: MM: SS?
- 3. Delphi: Simple hh: mm: ss Temporizador
- 4. ¿Cómo convierto hh: mm: ss a hh: mm en SQL Server?
- 5. Formato de fecha en dd/mm/aaaa hh: mm: ss
- 6. ¿Convertir tiempo en formato HH: MM: SS a segundos solamente?
- 7. ¿cómo puedo definir NSTimeInterval al formato mm: ss en iphone?
- 8. Cómo convertir los segundos en este formato "HH: mm: ss"
- 9. Tiempo en cadena con formato HH: MM: SS (programación C)
- 10. Muestra la hora actual en este formato: HH: mm: ss
- 11. Patrón Regex para HH: MM: cadena de tiempo SS
- 12. Cómo convertir un decimal en tiempo, ej. HH: MM: SS
- 13. SQL Server Formato Fecha DD.MM.YYYY HH: MM: SS
- 14. Hora actual en HH: MM: ¿formato SS am/pm?
- 15. Cómo convertir aaaa-MM-dd hh: mm: ss a "decimoquinto Abr 2010" usando PHP
- 16. llegar rápidamente a AAAA-MM-DD HH: MM: SS en Perl
- 17. C - Convertir time_t a cadena con formato AAAA-MM-DD HH: MM: SS
- 18. Cómo formatear una fecha en formato MM/dd/aaaa HH: mm: ss en JavaScript?
- 19. Force XmlSerializer para serializar DateTime como 'AAAA-MM-DD hh: mm: ss'
- 20. Obteniendo la hora actual como una cadena YYYY-MM-DD-HH-MM-SS
- 21. ¿Hay un nombre para el formato de fecha "AAAA-MM-DD HH: MM: SS"?
- 22. Conversión de marca de tiempo en Oracle para YYYY-MM-DD HH: MM: SS formato
- 23. ¿Hay una función de Matlab para convertir segundos transcurridos a formato HH: MM: SS?
- 24. ¿Cómo convertirías los segundos a formato HH: MM: SS en SQLite?
- 25. Forma simple de convertir HH: MM: SS (horas: minutos: segundos segundos) a segundos
- 26. Cómo convertir un número entero (tiempo) a HH: MM: SS :: 00 en SQL Server 2008?
- 27. Programa para convertir el tiempo en segundos a formato hh: mm: ss
- 28. ¿Cómo convierto HH de Paypal: MM: SS DD Mmm (.) YYYY PST/PDT a C# UTC DateTime?
- 29. La salida está en segundos. convertir a formato hh: mm: ss en php
- 30. PostgreSQL - Cómo convertir segundos en un campo numérico a HH: MM: SS
muy apreciada, eso es lo que estaba pensando, pero yo sólo quería comprobar que no estaba perdiendo algo ya incluidos como parte del iOS SDK. – fuzzygoat
que tú. Me salvó un dolor de cabeza. – Robert
Quiero señalar que ":" funciona como un delimitador solo en inglés y en algunos otros idiomas. Finlandés, por ejemplo, usa "." - como este "15.02.59" – sgosha