使用Swift查找NSDates之间的秒数差(作为整数)

w80xi6nr  于 2022-12-22  发布在  Swift
关注(0)|答案(7)|浏览(138)

我正在写一段代码,我想计算一个按钮被按下的时间。为了做到这一点,我记录了一个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,所以我很难理解给出的答案。如果有更有效的方法来找出按钮被按下了多久,我愿意接受建议。

ryoqjall

ryoqjall1#

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

let elapsed = Date().timeIntervalSince(timeAtPress)

注意Date引用后面的()Date()示例化一个新的日期对象,然后timeIntervalSince返回该日期对象与timeAtPress之间的时间差,这将返回一个浮点值(技术上是TimeInterval)。
如果您希望将其截断为Int值,只需用途:

let duration = Int(elapsed)

顺便说一句,您对timeAtPress变量的定义不需要示例化Date对象。

var timeAtPress: Date!

这将变量定义为Date变量(隐式解 Package 的变量),但您可能会将该变量的实际示例化推迟到调用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,并忍受可能带来的任何不准确。

sq1bmfud

sq1bmfud2#

雨燕5

let differenceInSeconds = Int(endDate.timeIntervalSince(startDate))
nfzehxib

nfzehxib3#

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

nfs0ujit4#

根据Freddy的回答,这是swift 3中的函数:

let start = Date()
let end = Date(timeIntervalSince1970: 100)
let calendar = Calendar.current
let unitFlags = Set<Calendar.Component>([ .second])
let datecomponents = calendar.dateComponents(unitFlags, from: start, to: end)
let seconds = datecomponents.second
print(String(describing: seconds))
lh80um4z

lh80um4z5#

这就是你如何可以得到的最新版本的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)

rryofs0p

rryofs0p6#

雨燕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)")
6uxekuva

6uxekuva7#

适用于“hh:mm”格式的2次之间的Swift 3秒

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)

相关问题