<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          為什么計(jì)算機(jī)起始時(shí)間是1970年1月1日?

          共 2141字,需瀏覽 5分鐘

           ·

          2020-05-25 23:23



          92d4ebf42c0a688165eca79a9cc4e48c.webp

          d09c9a842f0d138827754c1b3fd71022.webp

          3caaf57afcbeaa32ab1d117208671e6e.webp

          578457fdd6d30387ca7b1f5fba71a532.webp

          fff5ce1e6e67aa41195157a813027837.webp

          443855299d532761f5fc2d76af10d191.webp

          25a454754c7c61ba4ae66965f8eab7a6.webp

          ca5311d45e62afd90b8cb958d8d9051b.webp


          問(wèn)題復(fù)現(xiàn)

          1970-01-01對(duì)于開(kāi)發(fā)者來(lái)說(shuō)都是不陌生的,有些系統(tǒng)對(duì)于時(shí)間的處理如果不夠好的話,就可能把時(shí)間顯示成1970-01-01,所以經(jīng)常有用戶看到1970-01-01這個(gè)時(shí)間。

          這種情況其實(shí)是很簡(jiǎn)單就可以復(fù)現(xiàn)的,當(dāng)我們嘗試使用以下Java代碼定義時(shí)間:

          Date?date?=?new?Date(0);
          System.out.println(date);

          打印出來(lái)的結(jié)果:

          Thu?Jan?01?08:00:00?CST?1970

          通過(guò)Date的構(gòu)造函數(shù)的Java Doc說(shuō)明我們也能得到一些蛛絲馬跡:

          3fe47e3f97fbfdac6735e761167b6647.webp

          該構(gòu)造函數(shù)接收用戶指定一個(gè)毫秒數(shù),如new Date(1000),表示獲得一個(gè)距離"epoch"有1000毫秒的時(shí)間。在Java中,這個(gè)時(shí)間是1970, 00:00:00 GMT。

          0df730d5a76c9d0607842b48d8c277ea.webp

          349a762561febd9bfdcb4a3925ecf108.webp

          6a7da322a7816a1ae7fb41637c76dfbd.webp


          時(shí)間戳

          一切要從Unix操作系統(tǒng)誕生開(kāi)始說(shuō)起。

          1969年8月,貝爾實(shí)驗(yàn)室的程序員肯湯普遜利用妻兒離開(kāi)一個(gè)月的機(jī)會(huì),開(kāi)始著手創(chuàng)造一個(gè)全新的革命性的操作系統(tǒng),他使用B編譯語(yǔ)言在老舊的PDP-7機(jī)器上開(kāi)發(fā)出了Unix的一個(gè)版本。

          隨后,湯普遜和同事丹尼斯里奇改進(jìn)了B語(yǔ)言,開(kāi)發(fā)出了C語(yǔ)言,重寫了Unix,新版于1971年發(fā)布。

          6a7739418e142976e5cb30ef7b2a728a.webp

          在Unix被發(fā)明出來(lái)之后,需要在Unix上表示時(shí)間,就需要想辦法定義一個(gè)能表示一份數(shù)據(jù)在某個(gè)特定時(shí)間之前已經(jīng)存在的、完整的、可驗(yàn)證的數(shù)據(jù)來(lái)表示時(shí)間。

          于是,Unix時(shí)間戳被定義出來(lái),即通過(guò)當(dāng)前時(shí)間和一個(gè)"紀(jì)元時(shí)間"進(jìn)行對(duì)比,其間相差的秒數(shù)作為時(shí)間戳。

          為了讓Unix時(shí)間戳表示時(shí)間這種方式用的盡可能久,最初就把Unix誕生的時(shí)間1971-1-1定義成"紀(jì)元時(shí)間"。

          104af63c6977dd1639c7c254c3180849.webp

          18e6d2d8e2bc9993ab314d59ce1143f7.webp

          993ba849d10e90c492298dc3642caf92.webp

          6e8bbe1662d90c683dd18ae49b5ab9dc.webp


          時(shí)間戳修改

          除了開(kāi)始時(shí)間是1971-1-1而不是1970-1-1外,最初的時(shí)間戳也不是每增加1秒時(shí)間戳就變動(dòng)一次,而是每1/60秒都會(huì)改變一次時(shí)間戳。

          另外,Unix是在1971年發(fā)明出來(lái)的,當(dāng)時(shí)的計(jì)算機(jī)系統(tǒng)是32位,如果用32表示有整數(shù),那么最大值是2147483647(2^31-1)。

          那么,簡(jiǎn)單做一個(gè)數(shù)學(xué)計(jì)算,如果用當(dāng)時(shí)的時(shí)間戳計(jì)算方式來(lái)表示時(shí)間的話,Unix時(shí)間戳最多可以使用4294967296/(60*60*24)/60 = 828.5天(一天有60*60*24秒,每1/60秒會(huì)占用一個(gè)時(shí)間戳)。

          想象一下,設(shè)計(jì)出一個(gè)計(jì)算機(jī)系統(tǒng),他的時(shí)間只能表示 828.5天,是不是很難讓人接受,但是最初的Unix確實(shí)是這樣的。

          后來(lái),Unix的開(kāi)發(fā)者們也漸漸意識(shí)到這樣不是長(zhǎng)久之計(jì),于是開(kāi)始做出改變。

          最開(kāi)始,他們將每1/60秒改變一次時(shí)間戳修改成每1秒改變一次時(shí)間戳。這樣時(shí)間戳可以表示的時(shí)間就又放大了60倍。這時(shí)候有828.5*60/365 = 136年。

          這時(shí)候,一方面136年已經(jīng)足夠久了,紀(jì)元時(shí)間稍微向前調(diào)一下影響也不大。另外一方面為了方便記憶和使用。

          于是就把紀(jì)元時(shí)間從1971-01-01調(diào)整到1970-01-01了。

          7b8199b533405a1b49cb1e73ac3b14d6.webp

          于是,隨著后面各種開(kāi)發(fā)語(yǔ)言的誕生,就都沿襲了1970-1-1這個(gè)設(shè)定。

          所以,通常我們說(shuō)的時(shí)間戳,就是指格林威治時(shí)間(GMT)1970年01月01日00時(shí)00分00秒起至現(xiàn)在的總秒數(shù)。

          17788db97e20da8719bfe9e765e75356.webp

          b4c90373375e9def2ebf3916ea86e456.webp

          bc70f28b1e7a8be75328ce026e14d4af.webp

          126d568dc4507d6aa224735512db8e81.webp

          2d96b04b8598326c76bf5246b7699e0b.webp

          b04f7a256854a3f2fbff1628f97da5a1.webp


          紀(jì)元時(shí)間與時(shí)區(qū)

          我們前面所提到的紀(jì)元時(shí)間的設(shè)置,都是基于格林威治標(biāo)準(zhǔn)時(shí)間的,即GMT時(shí)間。

          但是世界上各個(gè)地區(qū)有自己的時(shí)區(qū),都需要基于GMT時(shí)間進(jìn)行調(diào)整。

          1970-01-01 08:00:00的顯示顯然是受到了時(shí)區(qū)的影響,因?yàn)橹袊?guó)處于東八區(qū),所以時(shí)間會(huì)比標(biāo)準(zhǔn)時(shí)間早8小時(shí),而標(biāo)準(zhǔn)時(shí)間應(yīng)該是1970-01-01 00:00:00。

          應(yīng)該很多人都記得《蘋果"1970 事件"》,在幾年前,一個(gè)名為vista980622的網(wǎng)友在國(guó)外網(wǎng)站Reddit的論壇上發(fā)表了一篇“把iPhone時(shí)間改成1970年1月1日,手機(jī)即可永遠(yuǎn)變磚”的帖子。

          629a536da279c000daa6b3ff561c7e16.webp

          在該帖子發(fā)布不久,很多人都不相信,抱著試試看的態(tài)度將手機(jī)的時(shí)間設(shè)置成1970年1月1日,結(jié)果手機(jī)關(guān)機(jī)后重新開(kāi)機(jī)真的變磚了。

          因?yàn)槲覀兲幱跂|八區(qū),時(shí)間比標(biāo)準(zhǔn)時(shí)間要快8小時(shí),如果我們把時(shí)間調(diào)整成1970-01-01 00:00:00,那么標(biāo)準(zhǔn)時(shí)間就會(huì)是比這個(gè)時(shí)間少8小時(shí),即1969年12月31日16時(shí)0分0秒。

          但是,IOS設(shè)備是以UTC時(shí)區(qū)(GMT時(shí)間)的1970年1月1日0點(diǎn)0時(shí)0秒為界限,數(shù)值為0,用戶把時(shí)間調(diào)整到1969年12月31日16時(shí)0分0秒,系統(tǒng)就要出現(xiàn)負(fù)值的時(shí)間。

          系統(tǒng)版本為IOS 8.0至IOS 9.3 beta3,并且搭載64位處理器(即處理器為A7-A9X的設(shè)備)的蘋果設(shè)備都會(huì)觸發(fā)這個(gè)Bug,導(dǎo)致變磚!

          2ee4c5df9e7cee15b1f7d6819f44b215.webp

          2681d1dd68fd80da4d71a6dbf1c83077.webp

          87508639cad670705724db9d4d58693e.webp

          a110f5cc774408aa78c3808eeee66b2a.webp



          參考資料:

          http://en.wikipedia.org/wiki/Unix_time#History?

          http://mobile.zol.com.cn/569/5691666_all.html


          微信群

          僅供關(guān)注公眾號(hào)「程序IT圈」?的讀者加入!進(jìn)群技術(shù)交流與日常交流討論,技術(shù)內(nèi)容不限于Java、Python、算法學(xué)習(xí)、求職內(nèi)推、資料分享等等 。當(dāng)然日常吹水也是可以的,但是禁止隨意開(kāi)車 。嚴(yán)禁一切推廣鏈接、二維碼,一經(jīng)發(fā)現(xiàn)送上飛機(jī)票?。

          加群方式:掃描二維碼,備注【加群】,微信號(hào):it4201 。

          同意后,手動(dòng)拉你進(jìn)群~


          好文章,我在看??

          瀏覽 51
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产丰满乱子伦午夜福利 | 嫩穴av| 九一九国产 | 欧美在线一级片 | 亚洲中文无码视 |