find使用Swift整数NSDates之间的秒差

我正在写一段代码,我想要一个button按下多长时间。 要做到这一点,我按下了button时logging了NSDate() ,并释放button时尝试使用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,所以我很难理解给出的答案。 如果有一个更有效的方法来找出button被按下多久,我愿意提供build议。 提前致谢。

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

 let elapsed = Date().timeIntervalSince(timeAtPress) 

请注意Date引用之后的()Date()实例化一个新的date对象,然后timeIntervalSince返回timeAtPresstimeAtPress之间的时间差。 这将返回一个浮点值(技术上, TimeInterval )。

如果你想要截断为一个Int值,你可以使用:

 let duration = Int(elapsed) 

而且,顺便说一句,你的timeAtPressvariables的定义不需要实例化一个Date对象。 我想你打算:

 var timeAtPress: Date! 

它将variables定义为一个Datevariables(一个隐含的解开的variables),但是你可能会推迟variables的实际实例,直到被调用。


或者,我经常使用CFAbsoluteTimeGetCurrent() ,例如,

 var start: CFAbsoluteTime! 

而当我想要设置startTime ,我执行以下操作:

 start = CFAbsoluteTimeGetCurrent() 

而当我想计算经过的秒数,我做了以下几点:

 let elapsed = CFAbsoluteTimeGetCurrent() - start 

值得注意的是, CFAbsoluteTimeGetCurrent文档警告我们:

重复调用此函数并不能保证单调递增的结果。 系统时间可能由于与外部时间参考同步或由于明确的时钟用户更改而降低。

这意味着,如果您不幸测量到这些调整中的一个时间,则可能会计算不正确的经过时间。 对于NSDate / Date计算也是如此。 使用基于mach_absolute_time的计算是最安全的(使用mach_absolute_time最容易):

 let start = CACurrentMediaTime() 

 let elapsed = CACurrentMediaTime() - start 

这使用mach_absolute_time ,但避免了技术问答QA1398中概述的一些复杂性。

请记住,当设备重新启动时, CACurrentMediaTime / mach_absolute_time将被重置。 所以,底线,如果你需要准确的运行时间计算,而使用CACurrentMediaTime 。 但是,如果您要将此开始时间保存在永久性存储器中,您可能还记得在未来某个date重新启动应用程序的时间,那么您必须使用DateCFAbsoluteTimeGetCurrent ,并且可能会带来任何不准确的地方。

NSDate()和NSCalendar()的声音是一个不错的select。 使用日历计算并将实际的math部分留给框架。 这里是获取两个NSDate()之间秒的一个简单的例子

 let start = NSDate() let enddt = NSDate() let calendar = NSCalendar.currentCalendar() let datecomponenets = calendar.components(NSCalendarUnit.CalendarUnitSecond, fromDate: start, toDate: enddt, options: nil) let seconds = datecomponenets.second println("Seconds: \(seconds)") 

根据弗雷迪的回答,这是迅速的function3:

 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)") 

这是你如何才能在最新版本的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 

参考: 在两个NSDates(月/日/时/分/秒)

对于2秒之间的快速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)