还有另一种方法。它可以给结果比accepted answer
我比较他们略有不同(更多或更少)。我得到的区别-7秒OSX 10.9.3和+2秒的iOS 7.1.1
据我了解这种方式给出相同的结果,如果挂钟改变,但接受的答案给出,如果挂钟改变不同的结果?
下面的代码:
static CFAbsoluteTime getKernelTaskStartTime(void) {
enum { MICROSECONDS_IN_SEC = 1000 * 1000 };
struct kinfo_proc info;
bzero(&info, sizeof(info));
// Initialize mib, which tells sysctl the info we want, in this case
// we're looking for information about a specific process ID = 0.
int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, 0};
// Call sysctl.
size_t size = sizeof(info);
const int sysctlResult = sysctl(mib, COUNT_ARRAY_ELEMS(mib), &info, &size, NULL, 0);
assert(0 != sysctlResult);
const struct timeval * timeVal = &(info.kp_proc.p_starttime);
NSTimeInterval result = -kCFAbsoluteTimeIntervalSince1970;
result += timeVal->tv_sec;
result += timeVal->tv_usec/(double)MICROSECONDS_IN_SEC;
return result;
}
你已经接受了一个答案,但正如@ hotpaw2指出的那样,'NSDate'是一个挂钟时间戳,而诸如夏时制和NTP更新之类的更改可能导致两个连续时刻实时显示错误顺序, 'NSDate's(或'time_t's或任何其他挂钟时间戳。) –
@JonathanGrynspan确实问题没有得到解决,我的满意。看起来Apple虽然已经改变了CoreLocation和CoreMotion之间的格式,但显然还未尝试改进,但它完全没有生成稳健的时间戳。由于NSDate测量GMT,夏时制至少不应有所作为。因为接收电话对于实时操作而言不好,所以我的应用程序会要求飞行模式“最佳性能”。这也会阻止NTP。 – Potatoswatter
你想达到什么目的?您对精确时间戳有什么具体需求?苹果公司的时间戳几乎与其他系统一样,只是使用不同的类型名称。 –