Encuentra la diferencia en segundos entre NSDates como entero usando Swift
nstimeinterval (6)
Estoy escribiendo un código en el que quiero medir el tiempo que se mantuvo presionado un botón.
Para hacer eso, grabé un
NSDate()
cuando presioné el botón e intenté usar la función
timeIntervalSinceDate
cuando se soltó el botón.
Parece que funciona, pero no puedo encontrar ninguna manera de imprimir el resultado o cambiarlo a un número entero.
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 = ???
}
He visto algunas preguntas similares, pero no sé C, así que me costó entender las respuestas dadas. Si hay una manera más eficiente de averiguar cuánto tiempo se mantuvo presionado el botón, estoy abierto a sugerencias. Gracias por adelantado.
Así es como puede obtener la diferencia en la última versión de 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
Referencia: Obtener la diferencia entre dos NSDates en (meses / días / horas / minutos / segundos)
De acuerdo con la respuesta de Freddy, esta es la función en 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)")
NSDate () y NSCalendar () suenan como una buena opción.
Utilice el cálculo del calendario y deje la parte matemática real en el marco.
Aquí hay un ejemplo rápido de cómo obtener los segundos entre dos
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)")
Su intento de calcular el tiempo
elapsedTime
es incorrecto.
En Swift 3, sería:
let elapsed = Date().timeIntervalSince(timeAtPress)
Tenga en cuenta el
()
después de la referencia de
Date
.
Date()
crea una instancia de un nuevo objeto de fecha y luego
timeIntervalSince
devuelve la diferencia horaria entre eso y
timeAtPress
.
Eso devolverá un valor de coma flotante (técnicamente, un
TimeInterval
).
Si desea que se trunca a un valor
Int
, puede usar:
let duration = Int(elapsed)
Y, por cierto, su definición de la variable
timeAtPress
no necesita instanciar un objeto
Date
.
Supongo que pretendías:
var timeAtPress: Date!
Eso define la variable como una variable de
Date
(una implícitamente desenvuelta), pero presumiblemente diferiría la instanciación real de esa variable hasta que se llame
pressed
.
Alternativamente, a menudo uso
CFAbsoluteTimeGetCurrent()
, por ejemplo,
var start: CFAbsoluteTime!
Y cuando quiero configurar
startTime
, hago lo siguiente:
start = CFAbsoluteTimeGetCurrent()
Y cuando quiero calcular la cantidad de segundos transcurridos, hago lo siguiente:
let elapsed = CFAbsoluteTimeGetCurrent() - start
Vale la pena señalar que la documentación CFAbsoluteTimeGetCurrent() nos advierte:
Las llamadas repetidas a esta función no garantizan resultados monotónicamente crecientes. La hora del sistema puede disminuir debido a la sincronización con referencias de tiempo externas o debido a un cambio explícito del reloj del usuario.
Esto significa que si tiene la mala suerte de medir el tiempo transcurrido cuando se realiza uno de estos ajustes, puede terminar con un cálculo incorrecto del tiempo transcurrido.
Esto también es cierto para los
NSDate
/
Date
.
Es más seguro usar un
mach_absolute_time
basado en
mach_absolute_time
(lo más fácil con
CACurrentMediaTime
):
let start = CACurrentMediaTime()
y
let elapsed = CACurrentMediaTime() - start
Esto utiliza
mach_absolute_time
, pero evita algunas de sus complejidades descritas en
Preguntas y respuestas técnicas QA1398
.
Sin embargo,
CACurrentMediaTime
que
CACurrentMediaTime
/
mach_absolute_time
se restablecerá cuando se reinicie el dispositivo.
Entonces, en resumen, si necesita cálculos precisos del tiempo transcurrido mientras se ejecuta una aplicación, use
CACurrentMediaTime
.
Pero si va a guardar este tiempo de inicio en un almacenamiento persistente que puede recordar cuando la aplicación se reinicie en una fecha futura, entonces debe usar
Date
o
CFAbsoluteTimeGetCurrent
, y vivir con cualquier imprecisión que pueda implicar.
Swift 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)")
Para Swift 3 segundos entre 2 veces en "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
}
Uso
var sec1 = secondsIn(shuttleTime)
var sec2 = secondsIn(dateToString(Date()))
print(sec1-sec2)