2009-11-16 20 views
59

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.Convertir segundos enteros a HH: MM, iPhone

+0

Tome un vistazo a una [pregunta similar le pregunté hace un tiempo] (http://stackoverflow.com/questions/1025192/memory-leaks-formatting-a-string-to-display-time-each -segundo) que también cubre el aspecto de la memoria y la eficiencia. –

Respuesta

236

Estaba buscando lo mismo que está 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 así:

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

Gracias por su respuesta, se ve como lo que necesito, pero parece que no puedo usarlo sin errores. Estoy convencido de que el error está de mi parte. Si no te importa ayudarme más: Mi valor es un flotador y está en segundos. Lo tengo exhibiendo en una etiqueta cuando se presiona un botón. ¿A dónde iría su código, y cómo haría que mi etiqueta muestre el valor en el formato HH: MM? Muchas gracias, Stu – Stumf

+0

Ordenada, gracias por su ayuda. Su respuesta y http://stackoverflow.com/questions/1259028/convert-nsnumber-double-value-into-time respuesta por Pholker fueron la razón por la que pude hacer esto! Gracias de nuevo – Stumf

+0

Excelentes cosas: hicieron de este un método de clase y lo convirtieron en una categoría en NSString. De acuerdo con el bisturí, muy limpio. –

9

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

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

En i OS 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, puede utilizar 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]; 
} 
+0

Si también desea obtener segundos en el resultado, debe agregar la unidad 'NSCalendarUnitSecond' a las Unidades permitidas. Este ejemplo también funciona para aplicaciones Mac OS X. – edukulele

+0

Esto espera un doble no un int. Al menos en Swift. –

0

Para Swift con el reloj contar

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

Mientras @Aks' answer para obras de Swift, soy un poco escéptico acerca hardcoding valores en mi código. @ edukulele's answer es mucho más limpio, pero está en Objective-C. Lo traduje a Swift con un ligero cambio. Normalmente escribo mis formateadores como lazy var s.

private lazy var dateFormatter: NSDateComponentsFormatter = { 
    let formatter = NSDateComponentsFormatter() 
    formatter.zeroFormattingBehavior = .Pad 
    formatter.allowedUnits = [.Hour, .Minute, .Second] 
    formatter.unitsStyle = .Positional 
    return formatter 
}() 
+0

Esto es 'H: MM', no' HH: MM' como se solicitó. –

Cuestiones relacionadas