Como se ha dicho en uno de los comentarios, POSIX'sclock_gettime()
se implementó en IOS 10 y MacOS 10.12. Cuando se usa con el argumento CLOCK_MONOTONIC
, parece devolver el valor de tiempo de actividad.Sin embargo, esto no está garantizado por la documentación:
Para este reloj, el valor devuelto por clock_gettime() representa la cantidad de tiempo (en segundos y nanosegundos) desde un punto no especificado en el pasado (por ejemplo , el tiempo de inicio del sistema o la Época). Este punto no cambia después del tiempo de inicio del sistema.
y un extracto de la página man correspondiente macOS:
CLOCK_MONOTONIC reloj que se incrementa de forma monótona, el seguimiento del tiempo desde un punto arbitrario, y continuará aumentando mientras el sistema está dormido.
CLOCK_MONOTONIC_RAW reloj que se incrementa de forma monótona, siguiendo el tiempo desde un punto arbitrario como CLOCK_MONOTONIC. Sin embargo, este reloj no se ve afectado por los ajustes de frecuencia o tiempo. No se debe comparar con otras fuentes de tiempo del sistema.
CLOCK_MONOTONIC_RAW_APPROX como CLOCK_MONOTONIC_RAW, pero lee un valor almacenado en caché por el sistema al cambio de contexto . Esto se puede leer más rápido, pero con una pérdida de precisión, ya que puede devolver valores que son milisegundos anteriores.
CLOCK_UPTIME_RAW reloj que se incrementa de forma monótona, de la misma manera como CLOCK_MONOTONIC_RAW, pero que no incremento mientras el sistema está dormido. El valor devuelto es idéntico al resultado de mach_absolute_time() después de aplicar la conversión mach_timebase apropiada.
en cuenta que CLOCK_MONOTONIC
regresa con una precisión de microsegundos, mientras CLOCK_MONOTONIC_RAW
con una precisión de nanosegundos.
Código Swift:
func uptime() -> timespec {
var uptime = timespec()
if 0 != clock_gettime(CLOCK_MONOTONIC_RAW, &uptime) {
fatalError("Could not execute clock_gettime, errno: \(errno)")
}
return uptime
}
print(uptime()) // timespec(tv_sec: 636705, tv_nsec: 750700397)
Para aquellos que todavía están interesados por obtener el tiempo de arranque del kernel en Swift:
func kernelBootTime() -> timeval {
var mib = [ CTL_KERN, KERN_BOOTTIME ]
var bootTime = timeval()
var bootTimeSize = MemoryLayout<timeval>.size
if 0 != sysctl(&mib, UInt32(mib.count), &bootTime, &bootTimeSize, nil, 0) {
fatalError("Could not get boot time, errno: \(errno)")
}
return bootTime
}
print(kernelBootTime()) // timeval(tv_sec: 1499259206, tv_usec: 122778)
compañero Bien hecho. Iba a tener que buscar una comparación entre fecha de servidor/fecha local antes de esto ... Muy apreciada. – Magoo
Creo que esto no funciona para el simulador. – mkeremkeskin
Eso es correcto. –