获取iOS/OS X上系统启动的准确时间

Pot*_*ter 9 macos time objective-c uptime ios

是否有API来获取NSDateNSTimeInterval表示系统启动的时间?某些API(如[NSProcessInfo systemUptime]Core和Core Motion)自启动后返回时间.我需要将这些正常运行时间值与NSDates 精确地关联到大约一毫秒.

自启动以来的时间表面上提供了更高的精度,但很容易看出NSDate已经提供了大约100纳秒的精度,并且微秒以下的任何东西只是测量中断延迟和PCB时钟抖动.

显而易见的是从当前时间中减去正常运行时间[NSDate date].但是假设两个系统调用之间的时间没有变化,这很难实现.此外,如果线程在调用之间被抢占,则一切都被抛弃.解决方法是多次重复该过程并使用最小的结果,但是很糟糕.

NSDate 必须有一个主偏移量,它用于从系统正常运行时间生成具有当前时间的对象,是否真的没有办法获得它?

Sri*_*aju 7

在OSX中,您可以使用sysctl().这就是OSX Unix实用程序的uptime功能. 源代码可用 - 搜索boottime.

虽然公平的警告,在iOS我不知道这是否会奏效.

更新:找到一些代码:)

#include <sys/types.h>
#include <sys/sysctl.h>  

#define MIB_SIZE 2  

int mib[MIB_SIZE];
size_t size;
struct timeval  boottime;

mib[0] = CTL_KERN;
mib[1] = KERN_BOOTTIME;
size = sizeof(boottime);
if (sysctl(mib, MIB_SIZE, &boottime, &size, NULL, 0) != -1)
{
    // successful call
    NSDate* bootDate = [NSDate dateWithTimeIntervalSince1970:
                               boottime.tv_sec + boottime.tv_usec / 1.e6];
}
Run Code Online (Sandbox Code Playgroud)

看看这是否有效......