为什么在操作系统以及很多编程语言中把1970年作为时间的最小值

我们知道在Java中System.currentTimeMillis()方法来获取系统当前时间与1970年1月1日0点之间的毫秒差距。而在.NET中也有System.Environment.TickCount()方法来获取与1970年1月1日0点之间的毫秒差距,这个1970.01.01
00:00:00就是系统的最小时间,那么为什么系统的最小时间是这个,而不是0001.01.01 00:00:00呢?

这个还是要从计算机的构造说起,可以追溯到Unix操作系统。UNIX系统认为1970年1月1日0点是时间纪元,所以我们常说的UNIX时间戳是以1970年1月1日0点为计时起点时间的。

计算机是怎么计时间的呢?设定一个时间的最小值,然后设置一个变量,每过一秒,这个变量就加1.所以当前时间就是最小时间与变量的和。最初计算机操作系统是32位,而时间也是用32位表示。32位能表示的最大值是2147483647。另外1年365天的总秒数是31536000,2147483647/31536000=
68.1,也就是说32位能表示的最长时间是68年,也就是说,以当时的计算机水平,能够记住的时间最多是68年,因为那个变量最多能够存那么多秒数。那时候20世纪中后期,那时候人们就需要制定时间的最小值啊。总不能是0001年吧,那即使加上68年也远远没到那会的时间啊。最终综合考量,决定把1970年1月1日0点定位最小值。因为那时候32位系统足以解决那个年头的计数问题。

现在我们思考,如果是1970年是最小年头,32位系统的话,那么到了2038年01月19日03时14分07秒(这个就是32位能够记住的最大的数),时间还是会回归到最小值。

上边说过了,那时候是七八十年代,已经足以解决当时的问题了。他们想,2038年出现问题,就让那时候的后代去解决吧。事实上他们是对的,因为现在我们已经解决了这个问题,就是64位系统,因为用64位操作系统可以表示到292,277,026,596年12月4日15时30分08秒,相信我们的N代子孙,哪怕地球毁灭那天都不用愁不够用了,因为这个时间已经是千亿年以后了。

正如中国政府对南海问题持有的态度,让后代去解决吧,我们把眼前的事情解决了就行,搁置争议,共同开发。

时间: 2024-11-09 05:13:38

为什么在操作系统以及很多编程语言中把1970年作为时间的最小值的相关文章

《数据结构与算法之美》 <03>数组:为什么很多编程语言中数组都从0开始编号?

提到数组,我想你肯定不陌生,甚至还会自信地说,它很简单啊. 是的,在每一种编程语言中,基本都会有数组这种数据类型.不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构.尽管数组看起来非常基础.简单,但是我估计很多人都并没有理解这个基础数据结构的精髓. 在大部分编程语言中,数组都是从 0 开始编号的,但你是否下意识地想过,为什么数组要从 0 开始编号,而不是从 1 开始呢? 从 1 开始不是更符合人类的思维习惯吗? 你可以带着这个问题来学习接下来的内容. 如何实现随机访问? 什么是数

05| 数组:为什么很多编程语言中数组都从 0 开始编号?

提到数组,我想你肯定不陌生,甚至还会自信地说,它很简单啊. 是的,在每一种编程语言中,基本都会有数组这种数据类型.不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构.尽管数组看起来非常基础.简单,但是我估计很多人都并没有理解这个基础数据结构的精髓. 在大部分编程语言中,数组都是从0开始编号的,但你是否下意识地想过,为什么数组要从0开始编号,而不是从1开始呢? 从1开始不是更符合人类的思维习惯吗? 你可以带着这个问题来学习接下来的内容. 如何实现随机访问? 什么是数组?我估计你心中

编程语言中的1970

很多编程语言的时间中都要从1970年1月1日0点开始算起,前段时间苹果手机变砖的问题,也是由这个时间点所引起,那1970哪来的这么大魔力?今天我们就来讨论下这个问题. 一,最懒的一种解释方式是: 很多编程语言起源于UNIX系统,而UNIX系统认为1970年1月1日0点是时间纪元,所以我们常说的UNIX时间戳是以1970年1月1日0点为计时起点时间的. 有个这个懒人的解释,或许也能解决我们对1970的困惑,然而,有些人又会追问,为什么UNIX系统从1970年1月1日开始纪元呢? 二,我们来深入了解

为什么很多编程语言中数组都是从 0 开始编号?

1.什么是数组? 数组(Array)是一种线性表数据结构.它用一组连续的内存空间,来存储一组具有相同类型的数据. 概念解析:       线性表:线性表就是数据排成像一条线一样的结构.每个线性表上的数据最多只有前和后两个方向.其实除了数组,链表.队列.栈等也是线性表结构. 连续的内存空间和相同类型的数据:所以数组根据下标具有随机访问特性,这两个限制也让数组的很多操作变得非常低效,比如要想在数组中删除.插入一个数据,为了保证连续性,就需要做大量的数据搬移工作. 2.数组是如何实现根据下标随机访问数

5、数组:为什么很多编程语言中数组都从0开始编号?

从数组的内存模型上来看,"下标"最确切的定义应该是"偏移(offset)".那么a[0]就是偏移为0 的位置,即首地址,a[k]就表示偏移k个type_size的位置,所以计算a[k]的内存地址: a[k]_address = base_adress+k*typ_size 但是,如果从1开始计数,那么a[k]=base_adress+(k-1)*typ_size.不难发现,从1开始,对CPU而言,多了一次减法指令,那么效率的优化就尽可能做到极致. 原文地址:http

编程语言中那些有趣的命名

学习NodeJS的时候,一定会用到其包管理器npm.npm的字面意思是node package manager,实际的含义也是这样,但是npm真正的英文名却是"npm is not an acronym",意思是"npm不是一个缩写",所以如果要问npm是什么单词的缩写,那么回答就是"'npm是不是一个缩写'的缩写". 这种计算机科学中的"饶舌"现象叫作递归缩写. 递归缩写(Recursive acronym)即递归首字缩写,

Linux应用环境实战10:Bash脚本编程语言中的美学与哲学(转)

阅读目录 一.一切皆是字符串 二.引用和元字符 三.字符串从哪里来.到哪里去 四.再加上一点点的定义,就可以推导出整个Bash脚本语言的语法了 五.输入输出重定向 六.Bash脚本语言的美学:大道至简 总结: 我承认,我再一次地当了标题党.但是不可否认,这一定是一篇精华随笔.在这一篇中,我将探讨Bash脚本语言中的美学与哲学. 这不是一篇Bash脚本编程的教程,但是却能让人更加深入地了解Bash脚本编程,更加快速地学习Bash脚本编程. 阅读这篇随笔,不需要你有Bash编程的经验,但一定要和我一

如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)?

Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数.Unix时间戳不仅被使用在Unix 系统.类Unix系统中,也在许多其他操作系统中被广告采用. 目前相当一部分操作系统使用32位二进制数字表示时间.此类系统的Unix时间戳最多可以使用到格林威治时间2038年01月19日03时14分07秒(二进制:01111111 1111

Python历史以及Python在编程语言中的定位

提及阿姆斯特丹你可以联想到郁金香,也可以联想到关于荷兰的一些东东,当然你如果是计算机爱好一族的话,你就一定会关心Python历史,以下就有关于Python历史的介绍. AD: 以本人的观点看来,Python这种语言是非常优美和强大在实际的应用中,是由专门为非专业程序员设计的计算机语言,而拥有很优美的语言Python为什么会用Python命名呢?如果你想对其有所了解,你也不妨看看关于Python历史的介绍. Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹