Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

373
Vistas
Swift DateComponentsFormatter elimina los ceros a la izquierda pero mantiene al menos un dígito en el lugar de los minutos

Estoy usando el siguiente DateComponentsFormatter en Swift:

 let formatter = DateComponentsFormatter() formatter.unitsStyle = .positional formatter.allowedUnits = [.hour, .minute, .second] formatter.zeroFormattingBehavior = [.default]

Esto produce resultados como 2:41 (durante 2 minutos y 41 segundos) y 08 (durante 8 segundos). Sin embargo, me gustaría mantener al menos un dígito en el lugar de los minutos, devolviendo 0:08 en lugar de 08. ¿Es esto posible con DateComponentsFormatter? Preferiría una solución que devuelva un resultado localizado.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Sí. Esto se puede lograr fácilmente agregando un condicional ternario basado en el intervalo de tiempo al establecer las unidades permitidas por el formateador de componentes de fecha:


Xcode 11 • Swift 5.1

 extension Formatter { static let positional: DateComponentsFormatter = { let positional = DateComponentsFormatter() positional.unitsStyle = .positional positional.zeroFormattingBehavior = .pad return positional }() }

 extension TimeInterval { var positionalTime: String { Formatter.positional.allowedUnits = self >= 3600 ? [.hour, .minute, .second] : [.minute, .second] let string = Formatter.positional.string(from: self)! return string.hasPrefix("0") && string.count > 4 ? .init(string.dropFirst()) : string } }

Uso

 8.0.positionalTime // "0:08" 161.0.positionalTime // "2:41" 3600.0.positionalTime // "1:00:00"
over 4 years ago · Santiago Trujillo Denunciar

0

Se me ocurrió esta solución, empleando una expresión regular, que aparentemente cubre todos los casos:

 let formatter = DateComponentsFormatter() formatter.allowedUnits = [.hour, .minute, .second] formatter.unitsStyle = .positional formatter.zeroFormattingBehavior = .pad func durationString(for duration: TimeInterval) -> String { formatter.string(from: duration)! .replacingOccurrences(of: #"^00[:.]0?|^0"#, with: "", options: .regularExpression) } durationString(for: 0) // 0:00 durationString(for: 1) // 0:01 durationString(for: 10) // 0:10 durationString(for: 60) // 1:00 durationString(for: 600) // 10:00 durationString(for: 3600) // 1:00:00 durationString(for: 36000) // 10:00:00
over 4 years ago · Santiago Trujillo Denunciar

0

Consulte un valor de propiedad zeroFormattingBehavior diferente. Utilizo esto para obtener el resultado que creo que estás buscando, pero experimenta según sea necesario...

 formatter.zeroFormattingBehavior = [.pad]
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda