2016-02-05 10 views
10

Mam NSTimer który odlicza od 2 godzin do 0.Format czasowy etykieta do godziny: minuty: sekundy w Swift

Oto niektóre z moich kodu:

var timer = NSTimer() 
let timeInterval:NSTimeInterval = 0.5 
let timerEnd:NSTimeInterval = 0.0 
var timeCount:NSTimeInterval = 7200.0 // seconds or 2 hours 

// TimeString Function 

func timeString(time:NSTimeInterval) -> String { 
    let minutes = Int(time)/60 
    let seconds = time - Double(minutes) * 60 
    let secondsFraction = seconds - Double(Int(seconds)) 
    return String(format:"%02i:%02i.%01i",minutes,Int(seconds),Int(secondsFraction * 10.0)) 
} 

Timer Label jest:

TimerLabel.text = "Time: \(timeString(timeCount))" 

Jednak moja etykieta zegar pokazuje jak:

Time: 200:59.0 

Jak mogę sformatować etykietę timera wyglądać tak:

Time: 01:59:59 // (which is hours:minutes:seconds)? 

[Proszę zauważyć, że nie mam żadnych problemów z moim minutnik, tylko trzeba wiedzieć jak zmienić format godziny za pomocą funkcji TimeString.]

EDYCJA: Ktoś wspomniał, że moje pytanie jest możliwym duplikatem tego: Swift - iOS - Dates and times in different format. JEDNAKĘ, pytam, jak zmienić format czasu za pomocą funkcji TimeString, którą podałem powyżej. Nie proszę o kolejny SPOSÓB, jak to zrobić.

Na przykład:

let minutes = Int(time)/60 

daje mi "200" minut. itp.

+2

Możliwy duplikat [Swift - iOS - Daty i godziny w innym formacie] (http://stackoverflow.com/questions/28489227/swift-ios-dates-and-times-in -different-format) – Abhijeet

+0

Gdzie są twoje obliczenia godzin? – rmaddy

+1

@Abhijeet To nie jest nawet bliskie duplikatu tego pytania. To pytanie nie dotyczy 'NSDate' i rozwiązanie tego pytania nie ma nic wspólnego z' NSDateFormatter'. – rmaddy

Odpowiedz

52

Twoje obliczenia są nieprawidłowe.

let hours = Int(time)/3600 
let minutes = Int(time)/60 % 60 
let seconds = Int(time) % 60 
return String(format:"%02i:%02i:%02i", hours, minutes, seconds) 
14

Rozwiązanie @ rmaddy jest dokładne i odpowiada na pytanie. Jednak ani pytanie, ani rozwiązanie nie uwzględniają użytkowników międzynarodowych. Proponuję użyć DateComponentsFormatter i pozwolić ramie obsłużyć obliczenia i formatowanie. Dzięki temu Twój kod będzie mniej podatny na błędy i bardziej przyszłościowy.

natknąłem tym blogu, który zawiera zwięzły rozwiązanie: http://crunchybagel.com/formatting-a-duration-with-nsdatecomponentsformatter/

wyciągnął z tego stanowiska, jest to fragment kodu, który zastąpi kod aktualnie używanego aby dokonać obliczeń. Aktualizacja dla Swift 3:

let duration: TimeInterval = 7200.0 

let formatter = DateComponentsFormatter() 
formatter.unitsStyle = .positional // Use the appropriate positioning for the current locale 
formatter.allowedUnits = [ .hour, .minute, .second ] // Units to display in the formatted string 
formatter.zeroFormattingBehavior = [ .pad ] // Pad with zeroes where appropriate for the locale 

let formattedDuration = formatter.string(from: duration) 
+0

Dobrze, ale są pewne przypadki, w których odpowiedź Maddy wystarczy. Na przykład, jeśli tworzysz aplikację tylko na jedną lokalizację. – Markus

+1

Świetna odpowiedź, zapomniałem, jak to zrobić. –

Powiązane problemy