为什么PHP程序是从1970年1月1日开始的
twocode

    在php程序中,time默认是从1970年1月1日开始的:

        var_dump(date('Y-m-d H:i:s',0));

    打印出来的结果:
        1970-01-01 08:00:00
    是1970年1月1日,实际上系统的时分秒是0点0分0秒(这里显示出来是8点与我们的php.ini的设置相关,后面详述)。
    
 为什么这个时间会定义在1970年1月1日这个时候呢?
    那要说起UNIX系统,而UNIX认为1970年1月1日0点是时间纪元. 

     为什么选它为时间纪元呢?

    归根结底,最初或者当前最普遍的计算机操作系统仍是32位系统,所以时间戳也只好用32位表示。Integer在PHP内用32位表示,PHP中的最大Int值:PHP_MAX_INT就是2147483647;因此32位能表示存储的最大值是2147483647,对应的时间戳的最大值也只能是2147483647

    在此基础上,1365天的总秒数是31536000:                       2147483647/31536000 = 68.1(年)

    也就是说32位能表示的最长时间是68年,而实际上到2038年01月19日03时14分07秒,便会到达最大时间,过了这个时间点,所有32位操作系统时间便会变为:
    10000000 00000000 00000000 00000000
也就是1901年12月13日20时45分52秒,这样便会出现时间回归的现象,很多软件便会运行异常了,这也叫2038bug问题
    到这里,我想问题的答案已经出来了:
    因为用32位来表示时间的最大间隔是68年,而最早出现的
UNIX操作系统综合考虑计算机产生的年代和应用的时限取了1970年1月1日作为UNIX TIME的纪元时间(开始时间),而PHP自然也遵循了这一约束。

      2038bug问题

    不过2038bug问题导致的时间回归的现象将随着64位系统和64位软件的普及,将不再是问题。因为用64位操作系统可以表示到292,277,026,596年12月4日15时30分08秒,相信我们的N代子孙,哪怕地球毁灭那天都不用愁不够用了,因为这个时间已经是千亿年以后了,谁又知道那时候计算机又会被神马取代。

   PHP.ini

    最后一个问题:上面var_dump(date('Y-m-d H:i:s',0)),打印出来的时间是8点而非0点,原因是存在系统时间和本地时间的问题,其实系统时间依然是0点,只不过我的电脑时区设置为东8区(php.ini 中的对应设置),故打印的结果是8点。

网友评论已关闭