swift nsdate nstimeinterval

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)