漫话:为什么计算机起始时间是1970年1月1日?

这是我的第 203 期分享

作者 | 漫画编程

来源 | 漫画编程(ID:mhcoding)

分享 | Java中文社群(ID:javacn666)

问题复现

1970-01-01对于开发者来说都是不陌生的,有些系统对于时间的处理如果不够好的话,就可能把时间显示成1970-01-01,所以经常有用户看到1970-01-01这个时间。

这种情况其实是很简单就可以复现的,当我们尝试使用以下Java代码定义时间:

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

打印出来的结果:

Thu Jan 01 08:00:00 CST 1970

通过Date的构造函数的Java Doc说明我们也能得到一些蛛丝马迹:

该构造函数接收用户指定一个毫秒数,如new Date(1000),表示获得一个距离"epoch"有1000毫秒的时间。在Java中,这个时间是1970, 00:00:00 GMT。

时间戳

一切要从Unix操作系统诞生开始说起。

1969年8月,贝尔实验室的程序员肯汤普逊利用妻儿离开一个月的机会,开始着手创造一个全新的革命性的操作系统,他使用B编译语言在老旧的PDP-7机器上开发出了Unix的一个版本。

随后,汤普逊和同事丹尼斯里奇改进了B语言,开发出了C语言,重写了Unix,新版于1971年发布。

在Unix被发明出来之后,需要在Unix上表示时间,就需要想办法定义一个能表示一份数据在某个特定时间之前已经存在的、完整的、可验证的数据来表示时间。

于是,Unix时间戳被定义出来,即通过当前时间和一个"纪元时间"进行对比,其间相差的秒数作为时间戳。

为了让Unix时间戳表示时间这种方式用的尽可能久,最初就把Unix诞生的时间1971-1-1定义成"纪元时间"。

时间戳修改

除了开始时间是1971-1-1而不是1970-1-1外,最初的时间戳也不是每增加1秒时间戳就变动一次,而是每1/60秒都会改变一次时间戳。

另外,Unix是在1971年发明出来的,当时的计算机系统是32位,如果用32表示有整数,那么最大值是2147483647(2^31-1)。

那么,简单做一个数学计算,如果用当时的时间戳计算方式来表示时间的话,Unix时间戳最多可以使用4294967296/(60*60*24)/60 = 828.5天(一天有60*60*24秒,每1/60秒会占用一个时间戳)。

想象一下,设计出一个计算机系统,他的时间只能表示 828.5天,是不是很难让人接受,但是最初的Unix确实是这样的。

后来,Unix的开发者们也渐渐意识到这样不是长久之计,于是开始做出改变。

最开始,他们将每1/60秒改变一次时间戳修改成每1秒改变一次时间戳。这样时间戳可以表示的时间就又放大了60倍。这时候有828.5*60/365 = 136年。

这时候,一方面136年已经足够久了,纪元时间稍微向前调一下影响也不大。另外一方面为了方便记忆和使用。

于是就把纪元时间从1971-01-01调整到1970-01-01了。

于是,随着后面各种开发语言的诞生,就都沿袭了1970-1-1这个设定。

所以,通常我们说的时间戳,就是指格林威治时间(GMT)1970年01月01日00时00分00秒起至现在的总秒数。

纪元时间与时区

我们前面所提到的纪元时间的设置,都是基于格林威治标准时间的,即GMT时间。

但是世界上各个地区有自己的时区,都需要基于GMT时间进行调整。

1970-01-01 08:00:00的显示显然是受到了时区《如何给女朋友解释为什么日本时间比中国快一个小时》的影响,因为中国处于东八区,所以时间会比标准时间早8小时,而标准时间应该是1970-01-01 00:00:00。

应该很多人都记得《苹果"1970 事件"》,在几年前,一个名为vista980622的网友在国外网站Reddit的论坛上发表了一篇“把iPhone时间改成1970年1月1日,手机即可永远变砖”的帖子。

在该帖子发布不久,很多人都不相信,抱着试试看的态度将手机的时间设置成1970年1月1日,结果手机关机后重新开机真的变砖了。

因为我们处于东八区,时间比标准时间要快8小时,如果我们把时间调整成1970-01-01 00:00:00,那么标准时间就会是比这个时间少8小时,即1969年12月31日16时0分0秒。

但是,IOS设备是以UTC时区(GMT时间)的1970年1月1日0点0时0秒为界限,数值为0,用户把时间调整到1969年12月31日16时0分0秒,系统就要出现负值的时间。

系统版本为IOS 8.0至IOS 9.3 beta3,并且搭载64位处理器(即处理器为A7-A9X的设备)的苹果设备都会触发这个Bug,导致变砖!

参考资料:

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

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

往期推荐

局部变量竟然比全局变量快 5 倍?

永远不要用双花括号初始化变量,除非你想OOM!

关注公众号发送”进群“,磊哥拉你进读者群。

好文章,我 在看 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

puppeteer执行js_使用Node.js和Puppeteer与表单和网页进行交互– 1

puppeteer执行jsHi guys! Today lets look at another powerful function of the puppeteer API using Node.js. 嗨,大家好! 今天,让我们看看使用Node.js的puppeteer API的另一个强大功能。 In the first part of this section, lets look a…

面试官:不会看SQL执行计划,简历也敢写精通SQL优化?

这是我的第 204 期分享作者 | 程序员内点事来源 | 程序员内点事(ID:chengxy-nds)分享 | Java中文社群(ID:javacn666)昨天中午在食堂,和部门的技术大牛们坐在一桌吃饭,作为一个卑微技…

scrollTop的兼容性小结

2019独角兽企业重金招聘Python工程师标准>>> 在页面上加上了 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 之后&#xff0c;document.body.scrollTop的值…

阿里巴巴为什么让初始化集合时必须指定大小?

这是我的第 205 期分享作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;哈喽&#xff0c;亲爱的小伙伴们&#xff0c;技术学磊哥&#xff0c;进步没得说&#xff01;欢迎来到…

ios页面间跳转方式总结

转自&#xff1a;http://www.cnblogs.com/anywherego/p/3542202.html 下面以OldViewController(oldC)的按钮btn点击后跳转到NewViewController(newC)为例说明: 1.Storyboard的segues方式 鼠标点击按钮btn然后按住control键拖拽到newC页面&#xff0c;在弹出的segue页面中选择跳…

啪啪打脸!领导说:try-catch要放在循环体外!

这是我的第 206 期分享作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;哈喽&#xff0c;亲爱的小伙伴们&#xff0c;技术学磊哥&#xff0c;进步没得说&#xff01;欢迎来到…

软件项目与产品的区别与联系_软件产品和软件过程之间的区别和关系

软件项目与产品的区别与联系软件产品和软件过程 (Software product and Software process) Software product and Software process: These two words are the one which is mostly confused with each other. In this article, we are going to explain each of these in deta…

Oracle官方推荐的性能测试工具!简单、精准又直观!

这是我的第 207 期分享作者 | 武培轩来源 | 武培轩&#xff08;ID&#xff1a;wupeixuan404&#xff09;分享 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;磊哥在前面的所有性能优化的文章中都是用了这款性能测试工具——JMH&#xff0c;一直没来得及给大家…

Hadoop开发第2期---虚拟机中搭建Linux

注&#xff1a;关于如何将hadoop源码导入Eclipse详见http://pan.baidu.com/s/1hq8ArUs 一、Hadoop配置软件&#xff08;我的电脑是Windows7旗舰--64bit&#xff09; 1. VMWare专用CentOS镜像(Centos是Linux操作系统的一种)2. VMware-workstation103. hadoop-1.1.2.tar.gz4. jdk…

看故事学知识,这篇Java代理的文章妙啊!

这是我的第 208 期分享作者 | java金融来源 | java金融&#xff08;ID&#xff1a;java4299&#xff09;分享 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;什么是代理代理模式是常用的java设计模式&#xff0c;他的特征是代理类与委托类有同样的接口&#x…

阿里《Java开发手册》中的 1 个bug!

这是我的第 210 期分享作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;本来打算写一篇《阿里巴巴为什么不允许日志输出时&#xff0c;使用字符串拼接&#xff1f;》的文章&a…

驳《阿里「Java开发手册」中的1个bug》?

这是我的第 211 期分享作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;前两天写了一篇关于《阿里Java开发手册中的 1 个bug》的文章&#xff0c;评论区有点炸锅了&#xff0…

轻松学算法的秘密!可视化算法网站汇总!(附动图)

对于「算法」的第一印象&#xff0c;我相信大部分人都是一样的&#xff0c;就是一个“难”字了得。而我比较特殊&#xff0c;我的第一印象、第二印象以至第 N 印象都觉得很难&#xff0c;所以为了更好的学习和理解算法&#xff0c;我千金一掷一下买了一堆的算法书&#xff0c;有…

链表竟然比数组慢了1000多倍?(动图+性能评测)

这是我的第 215 期分享作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;数组和链表是程序中常用的两种数据结构&#xff0c;也是面试中常考的面试题之一。然而对于很多人来说…

win7安装python

2019独角兽企业重金招聘Python工程师标准>>> 官网下载 python 安装包&#xff0c;一个 .msi 文件&#xff0c;双击安装 右键[计算机]-属性-高级系统设置-环境变量&#xff0c;在[系统变量]中找到 Path 变量&#xff0c;双击&#xff0c;在值后面添加 python 的安装路…

漫画:Java如何实现热更新?

Arthas&#xff08;阿尔萨斯&#xff09;是 Alibaba 开源的一款 Java 诊断工具&#xff0c;使用它我们可以监控和排查 Java 程序&#xff0c;然而它还提供了非常实用的 Java 热更新功能。所谓的 Java 热更新是指在不重启项目的情况下实现代码的更新与替换。使用它可以实现不停机…

自动化运维工具Saltstack详细介绍

Saltstack是一个新的基础设施管理工具。目前处于快速发展阶段&#xff0c;可以看做是pssh弱化的Puppet的组合。间接的反映出了saltstack的两大功能&#xff1a;远程执行和配置管理。Saltstack使用Python开发&#xff0c;是一个非常简单易用和轻量级的管理工具。由Master和Minio…

为什么建议你使用枚举?

枚举是 JDK 1.5 新增的数据类型&#xff0c;使用枚举我们可以很好的描述一些特定的业务场景&#xff0c;比如一年中的春、夏、秋、冬&#xff0c;还有每周的周一到周天&#xff0c;还有各种颜色&#xff0c;以及可以用它来描述一些状态信息&#xff0c;比如错误码等。枚举类型不…

数据结构树二叉树计算节点_查找二叉树中叶节点的数量 数据结构

数据结构树二叉树计算节点Algorithm: 算法&#xff1a; One of the popular traversal techniques to solve this kind of problems is level order tree traversal (Read: Level Order Traversal on a Binary Tree) where we use the concept of BFS. 解决此类问题的一种流行…