Gibt es eine API, um die NSDate
oder NSTimeInterval
zu erhalten, die die Startzeit des Systems darstellen? Einige APIs wie [NSProcessInfo systemUptime]
und Core Motion geben die Zeit seit dem Start zurück. Ich muss diese Uptime-Werte mit NSDate
s bis zu einer Millisekunde genau korrelieren.
Die Zeit seit dem Booten bietet scheinbar mehr Präzision, aber es ist leicht zu sehen, dass NSDate
bereits eine Genauigkeit in der Größenordnung von 100 Nanosekunden liefert und alles unter einer Mikrosekunde nur die Interrupt-Latenz und den PCB-Clock-Jitter misst.
Es liegt nahe, die Uptime von der aktuellen Zeit [NSDate date]
zu subtrahieren. Aber das setzt voraus, dass sich die Zeit zwischen den beiden Systemaufrufen nicht ändert, was schwer zu erreichen ist. Wenn der Thread zwischen den Anrufen vorweggenommen wird, wird alles hinausgeworfen. Die Problemumgehung besteht darin, den Vorgang mehrmals zu wiederholen und das kleinste Ergebnis zu verwenden, aber yuck.
NSDate
muss einen Master-Offset haben, den es verwendet, um Objekte mit der aktuellen Zeit aus der Systembetriebszeit zu generieren, gibt es wirklich keine Möglichkeit, es zu erhalten?
Die akzeptierte Antwort mit systcl
funktioniert, aber die von sysctl
für KERN_BOOTTIME
zurückgegebenen Werte, zumindest in meinen Tests (Darwin Kernel Version 11.4.2), sind immer ganze Sekunden (das Mikrosekundenfeld) , tv_usec
, ist 0). Dies bedeutet, dass die resultierende Zeit bis zu 1 Sekunde betragen kann, was nicht sehr genau ist.
Wenn man diesen Wert mit einem Wert vergleicht, der experimentell aus der Differenz zwischen REALTIME_CLOCK
und CALENDAR_CLOCK
abgeleitet wurde, unterscheiden sich diese Werte manchmal um einige Sekunden. Daher ist nicht klar, ob der KERN_BOOTTIME
-Wert genau der Zeit entspricht -Basis für die Uptime-Uhren.
Es gibt einen anderen Weg. Es könnte ein geringfügig anderes Ergebnis (weniger oder mehr) ergeben als die akzeptierte Antwort
Ich habe sie verglichen. Ich bekomme den Unterschied -7 Sekunden für OSX 10.9.3 und +2 Sekunden für iOS 7.1.1
Wie ich es verstehe, gibt diese Methode dasselbe Ergebnis, wenn sich die Wanduhr ändert, aber die angenommene Antwort gibt andere Ergebnisse, wenn sich die Wanduhr ändert ...
Hier Code:
%Vor%Tags und Links objective-c ios macos time uptime