2015-08-19 43 views
2

我想讓計時器顯示以下 - 小時:分鐘:秒:毫秒。我發現了一個網站教程,展示瞭如何做到這一點,但它不顯示幾小時。這裏是網站:Simple-stopwatch如何使NSTimer顯示小時數:分:秒

這裏是說做代碼:

var timer = NSTimer() 
var startTime = NSTimeInterval() 

func updateTime() 
{ 
    var currentTime = NSDate.timeIntervalSinceReferenceDate() 
    var elapsedTime : NSTimeInterval = currentTime - startTime 

    let minutes = UInt8(elapsedTime/60.0) 
    elapsedTime -= (NSTimeInterval(minutes) * 60) 

    let seconds = UInt8(elapsedTime) 
    elapsedTime -= NSTimeInterval(seconds) 

    let fraction = UInt8(elapsedTime * 100) 

    let strMinutes = String(format: "%02d", minutes) 
    let strSeconds = String(format: "%02d", seconds) 
    let strFraction = String(format: "%02d", fraction) 

    timeLabel.text = "\(strMinutes):\(strSeconds):\(strFraction)" 
} 

@IBAction func start(sender: AnyObject) { 
    if !timer.valid { 
     let aSelector : Selector = 「updateTime」 
     timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: aSelector, userInfo: nil, repeats: true) 
     startTime = NSDate.timeIntervalSinceReferenceDate() 
    } 
} 

@IBAction func stop(sender: AnyObject) { 
    timer.invalidate() 
} 

我不完全理解的updateTime()功能回事。我不明白它是如何將自己轉化爲分,秒......如果有人能給我一個解釋,我將不勝感激。

我的目標是增加幾個小時,但我也想完全理解發生了什麼。

回答

3

我會指導你一步一步你需要做什麼。

首先幾行提取以秒爲單位從當前時間到初始時間的時間間隔:

var currentTime = NSDate.timeIntervalSinceReferenceDate() 
var elapsedTime : NSTimeInterval = currentTime - startTime 

我假定這些行是顯而易見的。接下來,您要計算已經過了多少小時。

要做到這一點,你需要添加:

let hours = UInt8(elapsedTime/3600.0) 

這行工作,因爲elapsedTime以秒爲單位。一小時內有3600秒。當您將elapsedTime除以3600時,您會得到小時數。但是,這個數字可以是分數。例如,半小時對應1800秒,如果1800分3600,則得0.5。您需要將其舍入爲零。對此,您使用UInt8()構造函數。它將數字舍入到最小整數。在我的例子中,UInt8(0.5)等於零。

然後,您對其他組件使用相同的邏輯,指出一分鐘內有60秒(這就是爲什麼您除以60)。

您減少elapsedTime值在這些調用之間:

elapsedTime -= (NSTimeInterval(hours) * 3600) 

,因爲你需要刪除其對應的時間從elapsedTime數的秒數。否則,當你計算分鐘數時,你最終會計算一個更大的數額。例如,如果elapsedTime等於3660(1小時和1分鐘),除非您扣除3600,您將獲得61分鐘。

總體來說,您的應用程序的功能將類似於:

func updateTime() 
{ 
    var currentTime = NSDate.timeIntervalSinceReferenceDate() 
    var elapsedTime : NSTimeInterval = currentTime - startTime 

    let hours = UInt8(elapsedTime/3600.0) 
    elapsedTime -= (NSTimeInterval(hours) * 3600) 

    let minutes = UInt8(elapsedTime/60.0) 
    elapsedTime -= (NSTimeInterval(minutes) * 60) 

    let seconds = UInt8(elapsedTime) 
    elapsedTime -= NSTimeInterval(seconds) 

    let fraction = UInt8(elapsedTime * 100) 

    let strMinutes = String(format: "%02d", minutes) 
    let strSeconds = String(format: "%02d", seconds) 
    let strFraction = String(format: "%02d", fraction) 

    timeLabel.text = "\(strMinutes):\(strSeconds):\(strFraction)" 
} 

爲什麼減去一個時間是重要的更多信息

讓我們假設你有elapsedTime等於3660秒爲1小時,1分鐘。

線:

let hours = UInt8(elapsedTime/3600.0) 

將正確計算的小時數爲1。下一行:

elapsedTime -= (NSTimeInterval(hours) * 3600) 

扣除1 * 3600從elapsedTime值使它等於60。它所做的是去除那些不應用於計算分鐘數的秒數,因爲它們已經以小時表示。

假設你不這樣做,你會得到行:

let minutes = UInt8(elapsedTime/60.0) 

如果您elapsedTime仍然等於3660此行將使minutes至61等於你顯然不希望出現這種情況!

但是,如果你做扣除的小時數,elapsedTime等於60歲及以上線路將使分鐘數等於1並且輸出將是01:01,而不是01:61。

我希望這能說明一些事情。

+0

哦!所以變量'elapsedTime'就是以秒爲單位的實際時間量。然後,其餘的只是將'elapsedTime'轉換爲min,secs ...我正確嗎? – Horay

+0

因此,一天將會過去Time/86400? – Horay

+0

@MikeRally你是絕對正確的。不要忘記在計算天數後從elapsedTime中扣除numDays * 86400,或者您可能得到類似36小時的東西:) –

2

嘗試這種情況:

var timer = NSTimer() 
var startTime = NSTimeInterval() 

func updateTime() 
{ 
    var currentTime = NSDate.timeIntervalSinceReferenceDate() 
    var elapsedTime : NSTimeInterval = currentTime - startTime 

    let hours = UInt8(elapsedTime/3600.0) 
    elapsedTime -= (NSTimeInterval(hours) * 3600) 

    let minutes = UInt8(elapsedTime/60.0) 
    elapsedTime -= (NSTimeInterval(minutes) * 60) 

    let seconds = UInt8(elapsedTime) 
    elapsedTime -= NSTimeInterval(seconds) 

    let strHours = String(format: "%02d", hours) 
    let strMinutes = String(format: "%02d", minutes) 
    let strSeconds = String(format: "%02d", seconds) 
    let strFraction = String(format: "%02d", fraction) 

    timeLabel.text = "\(strHours):\(strMinutes):\(strSeconds)" 
} 

elapsedTime以秒測量,例如elapsedTime = 5000 seconds。一小時內有3600秒,所以你將它除以3600,將它下降到最接近的小時。現在hours = 1。然後你減去3600秒:elapsedTime = 1400。然後除以60,向下取得分鐘數(minutes = 23)。然後再次減去秒數elapsedTime = 1400 - 23 * 60 = 20 seconds

相關問題