获取系统开机时间

网上找了两篇文章,我也没细细研究,现在做项目,有时间再回来研究一下;

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()的结果。

你可能感兴趣的:(获取系统开机时间)