iOS Objective-C 的运行时间 - 毫秒精度

4

我正在尝试获取iOS的正常运行时间。我曾经使用过mach_absolute_time,但是发现它在睡眠期间会暂停。

我找到了这段代码:

- (time_t)uptime
{
    struct timeval boottime;
    int mib[2] = {CTL_KERN, KERN_BOOTTIME};
    size_t size = sizeof(boottime);
    time_t now;
    time_t uptime = -1;

    (void)time(&now);

    if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0)
    {
        uptime = now - boottime.tv_sec;
    }
    return uptime;
}

它能够完成任务,但是它返回的是整秒。有没有办法将毫秒数提取出来?

我不确定,但NSTimeInterval以毫秒为单位给出时间。NSTimeInterval timePassed_ms = [date timeIntervalSinceNow] * -1000.0;并且检查NSDate* bootDate = [NSDate dateWithTimeIntervalSince1970: boottime.tv_sec + boottime.tv_usec / 1.e6]; - Anoop Vaidya
获取到奇怪的值:1330475899251.326172 2013-04-14 01:08:54.996 app[1486:c07] 1365915981675.174072 2013-04-14 01:08:54.997 app[1486:c07] 1330475899257.684082 2013-04-14 01:08:55.012 app[1486:c07] 1365915981691.614258 - objectiveccoder001
自 1970 年以来经过的秒数很正常啊... :) - Anoop Vaidya
时间怎么可能是一样的?时间总是在变化 :) - Anoop Vaidya
哈哈,是的,我知道。但是数字来回重复。 - objectiveccoder001
显示剩余2条评论
3个回答

3

如果您想使用纯Objective-C语言,可以尝试:

NSTimeInterval uptime = [[NSProcessInfo processInfo] systemUptime];

NSTimeInterval是一个代表秒数的double类型定义。)

2
当 iDevice 处于睡眠状态时,这个程序会暂停吗? - objectiveccoder001

3
内核似乎没有存储更高分辨率的启动时间戳。
KERN_BOOTTIME 由 bsd/kern/kern_sysctl.c 中的 sysctl_boottime 函数实现。它调用 boottime_sec。
boottime_sec 在 bsd/kern/kern_time.c 中实现。它调用 clock_get_boottime_nanotime,具有有前途的名称。
clock_get_boottime_nanotime 在 osfmk/kern/clock.c 中实现。它在 nanosecs 参数中硬编码始终返回0。

有没有其他方法可以实现我需要的功能? - objectiveccoder001
你真正需要什么并不清楚。为什么在一个可能长达数小时或数天的持续时间中需要毫秒精度呢? - rob mayoff
这是一个漫长的故事,但我确实需要它 :) - objectiveccoder001
@objectiveccoder001 你有解决方案吗?我也已经寻找很长时间了... - Andrew Chang

2
我知道可能有点晚了,但是这里有你需要的内容:

我知道现在可能已经太晚了,但是还是要提供以下信息:

+ (NSTimeInterval)uptime {
    struct timeval boottime;
    int mib[2] = {CTL_KERN, KERN_BOOTTIME};
    size_t size = sizeof(boottime);

    struct timeval now;
    struct timezone tz;
    gettimeofday(&now, &tz);

    double uptime = -1;

    if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) {
        uptime = now.tv_sec - boottime.tv_sec;
        uptime += (double)(now.tv_usec - boottime.tv_usec) / 1000000.0;
    }
    return uptime;
} 

有人有维克多答案的Swift实现吗? - Pætur Magnussen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接