输错密码后iPhone提示请47年后再试一次?这其实是个早就存在的BUG!

微饭网官方微信

输错密码被锁47年?等解锁时还得给自己儿子解释其实是爸爸年轻时犯的错?其实这只是iPhone一个BUG而已。。

只因输错密码,手机提示停用47年。上海嘉定,陆女士称两岁半的儿子在玩手机时,因连续输错解锁密码,手机竟提示“请25114984分钟(约等于47.78年)后再试一次”。陆女士称,手机里有重要资料,不想刷机,但也不可能等40多年,难道要告诉孙子这是你爸爸惹的祸?

啥BUG?

因为手机被锁后电池电量耗尽断电了,导致手机时间跳转到1970-01-01,导致出现时间BUG,(1月2日应该是充电后想等他恢复。。)

然后需要25114984分钟(47.7834551年)

1970+48=?2018!

 

这BUG涉及到一个UNIX时间戳问题。

UNIX时间戳

iOS系统时间使用Unix时间戳(Unix epoch)表示(time_t数据类型)。在系统中,使用系统位数个二进制位储存时间。

Unix时间戳规定,UTC时区的1970年1月1日 0点0时0秒的值为0,以秒为单位,即每过一秒,二进制数字加1。

 

32位系统:

在32位系统中,time_t是长度为32位的,有符号整数(signed int)类型。首个二进制位是符号位,用来储存正负。正数则为1970/1/1以后的时间,负数反之;其余的31位用来记数。当时间到达2038年1月19日 3时14分08秒时,数值位全部向前进1,导致符号位被置1,其余31位为0。介时,将出现『时间回归』的情况,系统时间变为1901年12月13日 20时45分52秒,系统将会出现错误,出现错误后会出现各种各样的BUG,这件事在iPhone 5s以上的机型发生(如视频型号一致)。

所以后期Apple为了避免这种问题导致的错误发生,将最大时间期限定在了2038年1月1日 23时59分59秒。这样即使超出这个范围,在18天内也不会有太大问题,况且32位设备到那个时候基本都已经淘汰了。

64位系统会不会受到这个影响呢?通过计算我们可以得到,292,277,026,596年12月04日 15时30分08秒是64位系统可以表示的最大时间。

64位处理器的『时间回归』问题

我们说到了以UTC时区的1970年1月1日 0点0时0秒为界限,数值为0,时间正常流逝为正数,反之为负数。不过各位需要留意的是,时间受到时区的影响。

假设一种情况,我原来是北京时区,假设将时间设置到了1970年1月1日 0点0时0秒,那么我将这个时间转换为UTC时间,公式:北京时间 = GMT+8 = UTC+8,那么UTC时间则为1969年12月31日 16时0分0秒。这样就会出现时间负值,即时间回归bug触发,系统启动卡在Kernel(内核启动)阶段,时间错误,无法继续进行启动。

 

对待时间BUG问题可以采取的解决方式包括等待电池电量完全耗尽,或是拆开手机并断开电池,或是进行设备固件升级(刷机等),但很显然视频中没这么幸运了(有重要数据),所以日常利用iCloud自动备份或者iTunes进行iPhone手动备份和远离小盆友是非常必要的。

发表评论

相关文章