如何让 NSTimer 显示 Hrs : Min : Sec
How to make NSTimer show Hrs : Min : Sec
我正在尝试让计时器显示以下内容 - 小时 : 分钟 : 秒 : 毫秒。我找到了一个介绍如何操作的网站教程,但没有显示时间。这是网站:Simple-stopwatch
这是它说要做的代码:
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()
函数中发生的事情。我不明白它是如何将自己转换为分钟,秒...如果有人能给我一个解释,我将不胜感激。
我的目标是增加时间,但我也想完全了解发生了什么。
试试这个:
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
.
我会一步步指导你完成你需要做的事情。
前几行提取从当前时间到初始时间的时间间隔(以秒为单位):
var currentTime = NSDate.timeIntervalSinceReferenceDate()
var elapsedTime : NSTimeInterval = currentTime - startTime
我认为这些线条很明显。接下来,您要计算已经过去了多少小时。
为此您需要添加:
let hours = UInt8(elapsedTime / 3600.0)
此行有效,因为 elapsedTime
以秒为单位。一小时有3600秒。当您将 elapsedTime
除以 3600 时,您会得到小时数。但是,这个数字可以是小数。例如,半小时对应 1800 秒,如果将 1800 除以 3600,则得到 0.5。您需要将其向下舍入以获得 0。为此,您使用 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)
从 elapsedTime
的值中减去 1*3600 使其等于 60。这样做的目的是删除那些不应该用于计算分钟数的秒数,因为它们已经用小时表示了。
假设你不这样做而你到达了行:
let minutes = UInt8(elapsedTime / 60.0)
如果您的 elapsedTime
仍然等于 3660,此行将使 minutes
等于 61。您显然不希望这样!
但是,如果您扣除小时数,elapsedTime
等于 60,上面的行将使分钟数等于 1。输出将是 01:01 而不是01:61.
我希望这能澄清事情。
我正在尝试让计时器显示以下内容 - 小时 : 分钟 : 秒 : 毫秒。我找到了一个介绍如何操作的网站教程,但没有显示时间。这是网站:Simple-stopwatch
这是它说要做的代码:
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()
函数中发生的事情。我不明白它是如何将自己转换为分钟,秒...如果有人能给我一个解释,我将不胜感激。
我的目标是增加时间,但我也想完全了解发生了什么。
试试这个:
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
.
我会一步步指导你完成你需要做的事情。
前几行提取从当前时间到初始时间的时间间隔(以秒为单位):
var currentTime = NSDate.timeIntervalSinceReferenceDate()
var elapsedTime : NSTimeInterval = currentTime - startTime
我认为这些线条很明显。接下来,您要计算已经过去了多少小时。
为此您需要添加:
let hours = UInt8(elapsedTime / 3600.0)
此行有效,因为 elapsedTime
以秒为单位。一小时有3600秒。当您将 elapsedTime
除以 3600 时,您会得到小时数。但是,这个数字可以是小数。例如,半小时对应 1800 秒,如果将 1800 除以 3600,则得到 0.5。您需要将其向下舍入以获得 0。为此,您使用 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)
从 elapsedTime
的值中减去 1*3600 使其等于 60。这样做的目的是删除那些不应该用于计算分钟数的秒数,因为它们已经用小时表示了。
假设你不这样做而你到达了行:
let minutes = UInt8(elapsedTime / 60.0)
如果您的 elapsedTime
仍然等于 3660,此行将使 minutes
等于 61。您显然不希望这样!
但是,如果您扣除小时数,elapsedTime
等于 60,上面的行将使分钟数等于 1。输出将是 01:01 而不是01:61.
我希望这能澄清事情。