iPhone 变砖?详解Unix 时间戳与二进制计数原理

估计你已经知道了将 iPhone 手机的日期设置为 1970 年 1 月 1 日会让 iPhone 变「砖」的事情,希望你还没有手贱去试一下😂

下面将从 Unix 时间戳、二进制计数、时区三个方面讲述相关的原理~

关于 Unix 时间戳(Unix timestamp)

时间戳是自 1970 年 1 月 1 日(00:00:00 GMT)以来的秒数。它也被称为 Unix 时间戳(Unix Timestamp)。

Unix 时间戳(Unix timestamp),或称 Unix 时间(Unix time)、POSIX 时间(POSIX time),是一种时间表示方式,定义为从格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒起至现在的总秒数。Unix 时间戳不仅被使用在 Unix 系统、类 Unix 系统中,也在许多其他操作系统中被广泛采用。

说得通俗点,时间戳记录的就是从 1/1/1970 00:00:00 GMT 到现在经过的秒数,然后通过一些运算转换成具体的时间,如 PHP 中的转换方法如下:

Code   ViewPrint
  1. date('r', Unix timestamp)

二进制计数

二进制表示

显然时间戳是一个整数型变量,而时间戳每过一秒就要 + 1。

n 位整数的意思是一个在二进制下具有 n 位的数字。

如 \(10\),其在八位整数下的二进制如下:

\[00001010\]

那么 \(-10\) 呢?\(-00001010\)?显然不是,我们显然要为一个不伦不类的 \(-\) 号定义一个方法。

方法就是:二进制的首位作为符号位,符号位 = 1 表示负数,符号位 = 0 表示正数。

那么 \(-10\) 在八位整数下的二进制如下:

\[10001010\]

所以,一个 n 位整数,真正能够存储数字的位数其实只有 n-1 位,第一位留给了符号,一个 n 位整数,其存储范围为 \((-2^{n-1})\) ~ \((2^{n-1}-1)\),比如八位整数,存储范围为:\((-256)\) ~ \((255)\)。

二进制加法(均为正数)

那么我们来考虑一下,在二进制下,如何为一个整数 + 1,如:

\[10~+~5~=~15\]

\[00001010~+~00000101~=~00001111\]

看起来没有任何问题~00001111 在十进制下就是 15,计算的结果是正确的!

二进制减法(存在负数)

嗯,按同样的方法,我们计算一下 (-10) + 5:

\[-10~+~5~=~-5\]

\[10001010~+~00000101~=~10001111\]

10001111 等于....-15!?!

答案显然不正确,但是我们发现,对于数字部分的加法依然没有问题,问题就出在符号上。

事实上,存在负数的加法进行求和,需要对二进制取反码,再进行运算,但这不是今天讨论的重点,有兴趣的童鞋请 Google~

时区

看到这里,可能有很多读者觉得我在扯淡了,『设置成 1/1/1970 有什么问题?二进制不还是 0 吗?又没出现负数!』。

没错,最初听小幻讲的时候也是一头雾水,但是不久之后就恍然大悟。

让我们回到 Unix 时间戳的定义:「从格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒起至现在的总秒数。」

格林威治时间是中时区的时间,而中国的北京时间和上海时间都是东八区。也就是说:Unix 时间戳中的时间比我们真正看到的时间还要早 8 小时!

所以说,如果位于东八区的手机将时间设置为 1/1/1970 00:00:00,那么时间戳所表达的实际格林威治时间为 12/31/1969 16:00:00,同时,时间戳不再是那个简单的 0,而是负八小时,即 -28800 秒。

- so?等 8 小时就好了?

- 当然不是!!!

事实上,时间并不是 -28800 秒,因为存储时间戳的整数是一个无符号整数型,谁会蠢到认为时间有负数呢?n 位无符号整数,其范围为:\(0\) ~ \(2^n-1\)。

回到二进制加法,来看一下 「-28800」 秒的下一秒,时间戳是什么。

28800 在二进制下是 111000010000000,我们用 32 位整数来模拟时间戳 + 1:

\[~~10000000~00000000~01110000~10000000\]

\[+~00000000~00000000~00000000~00000001\]

\[=10000000~00000000~01110000~10000001\]

\[=9223372036854804608_{(10)}\]

因为时间戳是一个无符号整数,所以本来只是一个小小的负数,现在变成了一个比宇宙年龄还要大 20 倍的数字,这将引发一系列的致命问题,也就是我们所说的「变砖」了~

但是,这些都还只是我个人的猜测,具体的原因还要看 apple 怎么说咯。

如果我的文章对您有帮助,请我喝杯咖啡吧~

支付宝转账打赏⬆️

微信钱包转账打赏⬆️

目前评论:8   其中:访客  7   博主  1

  1. 韩国时尚购物起义 0

    商业是一种礼貌行为。如你正确理解。

  2. 米粒博客 3

    这个还真不敢去试 万一成砖头了 离开售后服务点比较远

    • rainman rainman

      @米粒博客 是的…本来想试一试的,但是仔细想了想,感觉新闻里说的过一会就好并不靠谱…原理上不是这样的…也没有敢去尝试…

  3. sadsa 4

    我牛逼别不服

  4. 美女图片站 MNTPZ.com 0

    模仿IP,不如弄种全新的,秒视乔。

  5. 192.168.1.1 1

    程序编写中 1970 经常出现。

  6. 跨境电商之家 1

    非常不错!感谢!!!

  7. 兰州SEO 0

    原来如此,感谢博主的分享,不过俺没有苹果手机,哈哈,顺便求回访

评论加载中...

发表评论

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen: