Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

376
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!