我正在编写一段代码,我想要按下按钮的时间。为此,我在按下按钮时录制了NSDate()
,并在释放按钮时尝试使用timeIntervalSinceDate
功能。这似乎有效,但我找不到任何方法来打印结果或将其切换为整数。
var timeAtPress = NSDate()
@IBAction func pressed(sender: AnyObject) {
println("pressed")
timeAtPress = NSDate()
}
@IBAction func released(sender: AnyObject) {
println("released")
var elapsedTime = NSDate.timeIntervalSinceDate(timeAtPress)
duration = ???
}
我已经看过几个类似的问题,但我不知道C所以我很难理解给出的答案。如果有更有效的方法来确定按钮被按下多长时间,我可以接受建议。提前谢谢。
答案 0 :(得分:180)
您计算elapsedTime
的尝试不正确。在Swift 3中,它将是:
let elapsed = Date().timeIntervalSince(timeAtPress)
请注意()
引用后的Date
。 Date()
实例化一个新的日期对象,然后timeIntervalSince
返回它与timeAtPress
之间的时差。这将返回浮点值(技术上,TimeInterval
)。
如果您希望将其截断为Int
值,则可以使用:
let duration = Int(elapsed)
而且,BTW,您对timeAtPress
变量的定义不需要实例化Date
对象。我认为你打算:
var timeAtPress: Date!
将变量定义为Date
变量(隐式展开的变量),但是在调用pressed
之前,您可能会推迟该变量的实际实例化。
或者,我经常使用CFAbsoluteTimeGetCurrent()
,例如,
var start: CFAbsoluteTime!
当我想设置startTime
时,我会执行以下操作:
start = CFAbsoluteTimeGetCurrent()
当我想计算经过的秒数时,我会执行以下操作:
let elapsed = CFAbsoluteTimeGetCurrent() - start
值得注意的是CFAbsoluteTimeGetCurrent
文档警告我们:
重复调用此函数并不能保证单调增加结果。由于与外部时间参考同步或由于时钟的明确用户更改,系统时间可能会减少。
这意味着如果您不幸测量其中一次调整所经过的时间,您最终可能会计算出错误的经过时间。对于NSDate
/ Date
计算也是如此。使用mach_absolute_time
计算是最安全的(最容易使用CACurrentMediaTime
完成):
let start = CACurrentMediaTime()
和
let elapsed = CACurrentMediaTime() - start
这使用了mach_absolute_time
,但避免了Technical Q&A QA1398中列出的一些复杂性。
但请记住,重启设备时会重置CACurrentMediaTime
/ mach_absolute_time
。因此,如果您在应用运行时需要准确的经过时间计算,请使用CACurrentMediaTime
。但是,如果您要将此开始时间保存在持久存储中,而您可能会在以后的某个日期重新启动该应用程序,那么您必须使用Date
或CFAbsoluteTimeGetCurrent
,并且只需使用可能需要的不准确之处。
答案 1 :(得分:21)
NSDate()和NSCalendar()听起来是个不错的选择。使用日历计算并将实际的数学部分留给框架。以下是获取两个NSDate()
let startDate = NSDate()
let endDate = NSDate()
let calendar = NSCalendar.currentCalendar()
let dateComponents = calendar.components(NSCalendarUnit.CalendarUnitSecond, fromDate: startDate, toDate: endDate, options: nil)
let seconds = dateComponents.second
println("Seconds: \(seconds)")
答案 2 :(得分:5)
快捷键5
let differenceInSeconds = Int(endDate.timeIntervalSince(startDate))
答案 3 :(得分:3)
根据弗雷迪的回答,这是swift 3中的功能:
let start = Date()
let enddt = Date(timeIntervalSince1970: 100)
let calendar = Calendar.current
let unitFlags = Set<Calendar.Component>([ .second])
let datecomponenets = calendar.dateComponents(unitFlags, from: start, to: enddt)
let seconds = datecomponenets.second
print("Seconds: \(seconds)")
答案 4 :(得分:2)
雨燕5
let startDate = Date()
let endDate = Date()
let calendar = Calendar.current
let dateComponents = calendar.compare(startDate, to: endDate, toGranularity: .second)
let seconds = dateComponents.rawValue
print("Seconds: \(seconds)")
答案 5 :(得分:0)
这就是你如何在最新版本的Swift 3中获得差异
let calendar = NSCalendar.current
var compos:Set<Calendar.Component> = Set<Calendar.Component>()
compos.insert(.second)
compos.insert(.minute)
let difference = calendar.dateComponents(compos, from: fromDate, to: toDate)
print("diff in minute=\(difference.minute!)") // difference in minute
print("diff in seconds=\(difference.second!)") // difference in seconds
参考:Getting the difference between two NSDates in (months/days/hours/minutes/seconds)
答案 6 :(得分:-5)
对于Swift 3 两次之间的秒数“hh:mm”
func secondsIn(_ str: String)->Int{
var strArr = str.characters.split{$0 == ":"}.map(String.init)
var sec = Int(strArr[0])! * 3600
var sec1 = Int(strArr[1])! * 36
print("sec")
print(sec+sec1)
return sec+sec1
}
用法
var sec1 = secondsIn(shuttleTime)
var sec2 = secondsIn(dateToString(Date()))
print(sec1-sec2)