objective-c - 在 iOS/OS X 上获取系统启动的精确时间

标签 objective-c ios macos time uptime

是否有 API 可以获取表示系统启动时间的 NSDateNSTimeInterval[NSProcessInfo systemUptime] 和 Core Motion 等一些 API 会返回启动后的时间。我需要将这些正常运行时间值与 NSDate 精确关联到大约一毫秒。

自启动以来的时间表面上提供了更高的精度,但很容易看出 NSDate 已经提供了 100 纳秒数量级的精度,而低于一微秒的任何东西都只是测量中断延迟和 PCB 时钟抖动。

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

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

最佳答案

在 OSX 中你可以使用 sysctl() . OSX Unix 实用程序 uptime 就是这样做的。 Source code可用 - 搜索 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];
}

看看这是否有效...

关于objective-c - 在 iOS/OS X 上获取系统启动的精确时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11282897/

相关文章:

ios - RestKit .20 RKRequestDescriptor postObject - (400-499) 中的预期状态代码,得到 200

ios - 容器 View 中的 View Controller 与 Objective C 中的父 Controller 之间的交互

macos - 可以在mac os上以编程方式更改DNS吗?

macos - 在 Mma 7 中将 Caps Lock 键重新映射为 Esc

objective-c - ASIHTTPRequest 在请求 :willRedirectToUrl: is implemented 时停止下载

ios - 检测 UICollectionView 的上拉或拖动

iphone - 为什么我无法从 iOS 应用程序向粉丝页面发帖?

javascript - 网页开发 : Disabling Chrome's Cache doesn't work on osx

iphone - 如何使表格 View 单元格作为按钮工作?

iOS:如何在 Constants.h 中转换字符串中的类型?