使用Swift查找NSDates之间以秒为单位的差异

时间:2014-10-28 00:44:30

标签: swift nsdate nstimeinterval

我正在编写一段代码,我想要按下按钮的时间。为此,我在按下按钮时录制了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所以我很难理解给出的答案。如果有更有效的方法来确定按钮被按下多长时间,我可以接受建议。提前谢谢。

7 个答案:

答案 0 :(得分:180)

您计算elapsedTime的尝试不正确。在Swift 3中,它将是:

let elapsed = Date().timeIntervalSince(timeAtPress)

请注意()引用后的DateDate()实例化一个新的日期对象,然后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。但是,如果您要将此开始时间保存在持久存储中,而您可能会在以后的某个日期重新启动该应用程序,那么您必须使用DateCFAbsoluteTimeGetCurrent,并且只需使用可能需要的不准确之处。

答案 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)