【问题标题】:Uptime iOS Objective-C - millisecond precisionUptime iOS Objective-C - 毫秒精度
【发布时间】:2013-04-14 05:02:38
【问题描述】:

我正在努力争取 iOS 的正常运行时间。我正在使用 mach_absolute_time - 但我发现它在睡眠期间暂停。

我找到了这个 sn-p:

- (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];
  • 获取奇怪的值:1330475899251.326172 2013-04-14 01:08:54.996应用[1486:54.99775.1707-04-14 01:08:54.997应用[1486:54.997 2013-04 2013-04 2013-04 -14 01:08:55.012 应用程序[1486:c07] 1365915981691.614258
  • 自 1970 年以来经过的秒数并不奇怪...... :)
  • 但数字实际上是随机变化的:P
  • 时间怎么会一样呢?时间总是在变化:)

标签: ios objective-c uptime


【解决方案1】:

如果你想要纯粹的 Objective-C,试试

NSTimeInterval uptime = [[NSProcessInfo processInfo] systemUptime];

NSTimeIntervaldouble的typedef,代表秒数。)

【讨论】:

  • iDevice休眠时会暂停吗?
【解决方案2】:

内核不会(显然)存储其启动时间的更高分辨率时间戳。

KERN_BOOTTIMEthe sysctl_boottime function in bsd/kern/kern_sysctl.c 实现。它调用boottime_sec

boottime_secbsd/kern/kern_time.c 中实现。它调用clock_get_boottime_nanotime,这个名字很有前途。

clock_get_boottime_nanotimeosfmk/kern/clock.c 中实现。它被硬编码为始终在其 nanosecs 参数中返回 0。

【讨论】:

  • 还有什么方法可以实现我需要的吗?
  • 不清楚你真正需要什么。为什么在可能长达数小时或数天的持续时间内需要毫秒精度?
  • 说来话长。但我确实需要它:)
  • @objectiveccoder001 你有解决办法吗?我也找了很久……
【解决方案3】:

我知道可能为时已晚,但你去吧:

+ (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 实现吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 2022-01-20
  • 2015-06-25
  • 1970-01-01
  • 2011-02-23
  • 2014-03-20
  • 1970-01-01
相关资源
最近更新 更多