Jak powiedział w jednym z komentarzy, POSIX'sclock_gettime()
został wdrożony w iOS 10 i MacOS 10.12. W przypadku użycia z argumentem CLOCK_MONOTONIC
, wydaje się, że zwraca wartość czasu pracy.Jednakże, nie jest to zagwarantowane dokumentacji:
tego zegara wartość zwrócony przez clock_gettime() reprezentuje czas (w sekundach i nanosekund) od nieokreślonym punkcie w przeszłości (na przykład , czas uruchomienia systemu lub Epoka). Ten punkt nie zmienia się po czasie uruchomienia systemu.
i wyciąg z odpowiedniego stronie MacOS człowieka:
CLOCK_MONOTONIC zegar, który zwiększa monotonicznie, śledzenie czasu od dowolnego punktu, i będzie nadal zwiększać, gdy system jest w trybie uśpienia.
CLOCK_MONOTONIC_RAW Zegar, który zwiększa monotonicznie, śledząc czas od dowolnego punktu, takiego jak CLOCK_MONOTONIC. Jednak ten zegar nie ma wpływu na regulację częstotliwości ani czasu. Nie należy go porównywać z innymi systemowymi źródłami czasu.
CLOCK_MONOTONIC_RAW_APPROX jak CLOCK_MONOTONIC_RAW, ale odczytuje wartość buforowane przez system na kontekst przełącznika. Można to odczytać szybciej, ale z mniejszą dokładnością, ponieważ może zwracać wartości, które są w milisekundach stare.
CLOCK_UPTIME_RAW zegar, który powiększa się monotonicznie w taki sam sposób jak CLOCK_MONOTONIC_RAW, ale to nie ma przyrostu, gdy system jest w trybie uśpienia. Zwrócona wartość jest identyczna z wynikiem mach_absolute_time() po zastosowaniu odpowiedniej konwersji mach_timebase.
pamiętać, że CLOCK_MONOTONIC
powraca z precyzją mikrosekund podczas CLOCK_MONOTONIC_RAW
z precyzją nanosekund.
Kod 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)
Dla tych, nadal zainteresowany dostając czas uruchamiania jądra w 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)
Brawo kolego. Miałem iść na randkę z datą serwera/lokalną datą porównania przed tym ... Tak bardzo doceniane. – Magoo
Myślę, że to nie działa na symulatorze. – mkeremkeskin
Zgadza się. –