我使用此代码来跟踪上次重新启动:
+ (float) secondsSinceLastReboot{
return ((float)(mach_absolute_time())) * ((float)timebase.numer) / ((float)timebase.denom) / 1000000000.0f;
}
我假设 mach_absolute_time() 基于上次设备启动时间,就像在 Mac 上一样。看来不是基于此。 我其实不知道它是基于什么。
看看以下行为(今天的日期是2009-09-20):
lastRebootTime = [[NSDate date] addTimeInterval:-[self secondsSinceLastReboot]];
//last Reboot Time will contain : 2009-09-20 07:42:14 +0100
我绝对确定我当时没有重新启动我的设备。我的设备已经一周没有启动了。
此外,当我从电缆上拔下设备并运行此应用程序时,似乎当设备进入睡眠状态时,lastRebootTime 开始在未来发生变化。看来
mach_absolute_time
并没有考虑睡眠时间。还是我错了?
我真的很希望能够获得设备上次重新启动时的时间戳。 有什么想法吗?
我自己也遇到了一些麻烦。 没有很多好的文档,所以我进行了实验。 这是我能够确定的:
mach_absolute_time 取决于设备的处理器。 它返回自设备上次重新启动以来的时间间隔(也称为正常运行时间)。 为了获得人类可读的形式,您必须根据 mach_timebase_info (比率)的结果对其进行修改,该结果将返回十亿分之一秒(或纳秒)。 为了使其更有用,我使用如下所示的函数:
#include <mach/mach_time.h>
int getUptimeInMilliseconds()
{
const int64_t kOneMillion = 1000 * 1000;
static mach_timebase_info_data_t s_timebase_info;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
(void) mach_timebase_info(&s_timebase_info);
});
// mach_absolute_time() returns billionth of seconds,
// so divide by one million to get milliseconds
return (int)((mach_absolute_time() * s_timebase_info.numer) / (kOneMillion * s_timebase_info.denom));
}
如果你不太关心计算时间,你可以使用 Foundation 中的简单 Obj-C 类
NSTimeInterval systemUptime = [[NSProcessInfo processInfo] systemUptime];
以防有人在 Swift 中需要它(适用于 4.2 和 5.0)。
let beginTime = mach_absolute_time()
// do something...
var baseInfo = mach_timebase_info_data_t(numer: 0, denom: 0)
if mach_timebase_info(&baseInfo) == KERN_SUCCESS {
let finiTime = mach_absolute_time()
let nano = (finiTime - beginTime) * UInt64(baseInfo.numer) / UInt64(baseInfo.denom)
}