网上找了两篇文章,我也没细细研究,现在做项目,有时间再回来研究一下;
NSProcessInfo *info = [NSProcessInfo processInfo];
NSLog(@"%f", info.systemUptime);
NSDate *now = [NSDate date];
NSTimeInterval interval = [now timeIntervalSince1970];
NSLog(@"start time: %@", [AppDelegate getDateStrFromTimeStep:interval - info.systemUptime]);
再写一个转换时间的函数,因为要解决时区的问题,不然显示的时间会有时区差别。
+(NSString *)getDateStrFromTimeStep:(long long)timestep{
NSDate *timestepDate = [NSDate dateWithTimeIntervalSince1970:timestep];
//1377044552->2013-08-21 08:22:32
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
//NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];
NSTimeZone* timeZone = [NSTimeZone systemTimeZone];
[formatter setTimeZone:timeZone];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
return [formatter stringFromDate:timestepDate];
}
但是实测是发现手机待机一段时间之后再次获取时间变了,可能是待机时时间没有计算在内
于是又找了一篇文章看了一下
/**
获取开机时间
@return 开机时间
*/
+ (NSString *)getUpTime{
size_t size;
sysctlbyname("kern.boottime", NULL, &size, NULL, 0);
char *boot_time = malloc(size);
sysctlbyname("kern.boottime", boot_time, &size, NULL, 0);
uint32_t timestamp = 0;
memcpy(×tamp, boot_time, sizeof(uint32_t));
free(boot_time);
NSDate* bootTime = [NSDate dateWithTimeIntervalSince1970:timestamp];
NSLog(@"BootTime: %@", bootTime);
return [self getDateStrFromTimeStep:[bootTime timeIntervalSince1970]];
}
+(NSString *)getDateStrFromTimeStep:(long long)timestep{
NSDate *timestepDate = [NSDate dateWithTimeIntervalSince1970:timestep];
//1377044552->2013-08-21 08:22:32
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
//NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];
NSTimeZone* timeZone = [NSTimeZone systemTimeZone];
[formatter setTimeZone:timeZone];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
return [formatter stringFromDate:timestepDate];
}
这次感觉上比较准确,不过boottime 也是有问题的,就是用户手动设置系统时间后,bootime会变动成手动设置的那个时刻;另外mach_absolute_time读取出来的tick数和bootime是一致的,个人猜测boottime其实就是换算mach_absolute_time()的结果。
网友评论