objective c - example - Convertir segundos enteros a HH: MM, iPhone
swift date format (6)
Estoy luchando con esto. Tengo un valor en segundos que quiero mostrar en una etiqueta en formato HH: MM. He buscado en Internet durante años y he encontrado algunas respuestas, pero o no las he entendido del todo, o me parecen una manera extraña de hacer lo que quiero. ¡Si alguien pudiera ayudarme en esto, sería genial! Tenga en cuenta que soy nuevo en este juego, por lo que esta pregunta puede parecer muy básica para los más experimentados.
Así es como lo hago:
-(NSString *)formatTimeFromSeconds:(int)numberOfSeconds
{
int seconds = numberOfSeconds % 60;
int minutes = (numberOfSeconds / 60) % 60;
int hours = numberOfSeconds / 3600;
//we have >=1 hour => example : 3h:25m
if (hours) {
return [NSString stringWithFormat:@"%dh:%02dm", hours, minutes];
}
//we have 0 hours and >=1 minutes => example : 3m:25s
if (minutes) {
return [NSString stringWithFormat:@"%dm:%02ds", minutes, seconds];
}
//we have only seconds example : 25s
return [NSString stringWithFormat:@"%ds", seconds];
}
En iOS 8.0 y versiones superiores, también se puede hacer con NSDateComponentsFormatter
. Debo mencionar que formateará la cadena sin el primer cero inicial, por ejemplo ''9:30'', pero no ''09: 30 ''. Pero si te gusta usar formateadores, puedes usar este código:
-(NSString *)getTimeStringFromSeconds:(double)seconds
{
NSDateComponentsFormatter *dcFormatter = [[NSDateComponentsFormatter alloc] init];
dcFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;
dcFormatter.allowedUnits = NSCalendarUnitHour | NSCalendarUnitMinute;
dcFormatter.unitsStyle = NSDateComponentsFormatterUnitsStylePositional;
return [dcFormatter stringFromTimeInterval:seconds];
}
Estaba buscando lo mismo que estás buscando pero no pude encontrar uno. Así que escribí uno -
- (NSString *)timeFormatted:(int)totalSeconds
{
int seconds = totalSeconds % 60;
int minutes = (totalSeconds / 60) % 60;
int hours = totalSeconds / 3600;
return [NSString stringWithFormat:@"%02d:%02d:%02d",hours, minutes, seconds];
}
funciona perfectamente en Swift también:
func timeFormatted(totalSeconds: Int) -> String {
let seconds: Int = totalSeconds % 60
let minutes: Int = (totalSeconds / 60) % 60
let hours: Int = totalSeconds / 3600
return String(format: "%02d:%02d:%02d", hours, minutes, seconds)
}
Mientras que la answer de @Aks para Swift funciona, soy un poco escéptico sobre los valores de codificación en mi código. La answer @ edukulele es mucho más limpia, pero está en Objective-C. Lo traduje a Swift con un ligero cambio. Normalmente escribo mis formateadores como varías lazy var
.
private lazy var dateFormatter: NSDateComponentsFormatter = {
let formatter = NSDateComponentsFormatter()
formatter.zeroFormattingBehavior = .Pad
formatter.allowedUnits = [.Hour, .Minute, .Second]
formatter.unitsStyle = .Positional
return formatter
}()
Para Swift con conteo de reloj
var timer = NSTimer()
var count = 1
func updateTime() {
count++
let seconds = count % 60
let minutes = (count / 60) % 60
let hours = count / 3600
let strHours = hours > 9 ? String(hours) : "0" + String(hours)
let strMinutes = minutes > 9 ? String(minutes) : "0" + String(minutes)
let strSeconds = seconds > 9 ? String(seconds) : "0" + String(seconds)
if hours > 0 {
clockOutlet.text = "/(strHours):/(strMinutes):/(strSeconds)"
}
else {
clockOutlet.text = "/(strMinutes):/(strSeconds)"
}
}
Para Swift:
func formatTimeInSec(totalSeconds: Int) -> String {
let seconds = totalSeconds % 60
let minutes = (totalSeconds / 60) % 60
let hours = totalSeconds / 3600
let strHours = hours > 9 ? String(hours) : "0" + String(hours)
let strMinutes = minutes > 9 ? String(minutes) : "0" + String(minutes)
let strSeconds = seconds > 9 ? String(seconds) : "0" + String(seconds)
if hours > 0 {
return "/(strHours):/(strMinutes):/(strSeconds)"
}
else {
return "/(strMinutes):/(strSeconds)"
}
}