为什么编程语言以及数据库要从1970年1月1日开始计算时

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 今天一时兴起想起了在SQL Server中使用DateTime.MinValue插入时间时报错的问题,原因就在于数据库的最小时间和.Net里的最小时间不一致导致的,网上查阅了些资料,找到如下结果 Net Framewrok 中, DateTime.
今天一时兴起想起了在SQL Server中使用DateTime.MinValue插入时间时报错的问题,原因就在于数据库的最小时间和.Net里的最小时间不一致导致的,网上查阅了些资料,找到如下结果
Net Framewrok 中,
DateTime.MinValue           => 0001/01/01 00:00:00
SqlDateTime.MinValue.Value  => 1753/01/01 00:00:00
 
SQL Server 2005 中,
DateTime 最小值              => 1753/01/01 00:00:00
SmallDateTime 最小值         => 1900/01/01 00:00:00
 
Net Framewrok 中,   
DateTime.MaxValue            => 9999/12/31 23:59:59.999 
SqlDateTime.MaxValue.Value   => 9999/12/31 23:59:59.997
SQL Server 2005 中, 
DateTime 最大值               => 9999/12/31 23:59:59.997 
SmallDateTime 最大值    =>2079.6.6 

 所以需要在数据库插入最小时间时不能使用DateTime.MinValue,需要使用

 
 SqlDateTime.MinValue.Value。  

 

好了到现在SQL Server数据库时间问题解决了,突然又想起了系统中有个啥1970年1月1日的时间。那这个时间又是啥来来历呢,怀着好奇宝宝的心理我有在网上查阅了一番得到如下解释:

1.可以简单的这样认为:UNIX系统认为1970年1月1日0点是时间纪元,所以我们常说的UNIX时间戳是以1970年1月1日0点为计时起点时间的。这个解释是懒人最爱^_^

 

2.这个比较科学
最初计算机操作系统是32位,而时间也是用32位表示。32位能表示的最大值是2147483647。另外1年365天的总秒数是31536000,2147483647/31536000 = 68.1,也就是说32位能表示的最长时间是68年,而实际上到2038年01月19日03时14分07秒,便会到达最大时间,过了这个时间点,所有32位操作系统时间便会变为10000000 00000000 00000000 00000000,也就是1901年12月13日20时45分52秒,这样便会出现时间回归的现象,很多软件便会运行异常了。

到这里,我想问题的答案已经出来了:因为用32位来表示时间的最大间隔是68年,而最早出现的UNIX操作系统考虑到计算机产生的年代和应用的时限综合取了1970年1月1日作为UNIX TIME的纪元时间(开始时间),至于时间回归的现象相信随着64为操作系统的产生逐渐得到解决,因为用64位操作系统可以表示到292,277,026,596年12月4日15时30分08秒,相信我们的N代子孙,哪怕地球毁灭那天都不用愁不够用了,因为这个时间已经是千亿年以后了。




附:另外文章

为什么这个时间会定义在197011日这个时候呢?

于是开始了Google,中文网页根本找不到答案。于是试着搜索英文关键字,Sun java论坛总算找到准确的帖子:

http://forums.sun.com/thread.jspa?threadID=595140&start=15

其中有一个回复:


suspect that Java was born and raised on UNIX system.
UNIX considers the epoch (when did time begin) to be midnight, January 1, 1970.

是说java起源于UNIX系统,而UNIX认为1970110点是时间纪元.

但这依然没很好的解释"为什么",出于好奇,继续Google,总算找到了答案:

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

这里的解释是:

最初计算机操作系统是32位,而时间也是用32位表示。

System.out.println(Integer.MAX_VALUE);
2147483647



IntegerJAVA内用32位表示,因此32位能表示的最大值是2147483647。另外1365天的总秒数是31536000,

2147483647/31536000 68.1

也就是说32位能表示的最长时间是68年,而实际上到20380119031407
秒,便会到达最大时间,过了这个时间点,所有32位操作系统时间便会变为
10000000 00000000 00000000 00000000

也就是19011213204552秒,这样便会出现时间回归的现象,很多软件便会运行异常了。

到这里,我想问题的答案已经出来了:

因为用32位来表示时间的最大间隔是68年,而最早出现的UNIX操作系统考虑到计算
机产生的年代和应用的时限综合取了
197011日作为UNIX TIME的纪元时间(开始
时间
),而java自然也遵循了这一约束。

至于时间回归的现象相信随着64为操作系统的产生逐渐得到解决,因为用64位操作
系统可以表示到
292,277,026,596124153008秒,相信我们的N代子孙,哪
怕地球毁灭那天都不用愁不够用了,因为这个时间已经是千亿年以后了。

最后一个问题:上面System.out.println(new Date(0)),打印出来的时间是8点而非0点,
原因是存在系统时间和本地时间的问题,其实系统时间依然是0点,只不过我的电脑时区
设置为东8区,故打印的结果是8点。

我想以上问题如果作为面试题,也能难倒一批人了.

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
9天前
|
存储 数据库 数据库管理
数据库的基本概念
数据库是计算机内统一管理的大量结构化数据集合,供多用户共享。它涉及数据组织、存储和管理,是软件开发的关键部分。数据库设计包括结构设计和根据用户需求建立数据库的过程,涵盖需求分析、各种结构设计及实施维护。广泛应用在企业管理、社交网络、电子商务等领域,有效提高数据效率和满足应用需求。
11 1
|
1月前
|
SQL 关系型数据库 MySQL
Go语言与数据库基础交互:SQL篇
【2月更文挑战第13天】本文旨在探讨Go语言如何与数据库进行基础交互,特别关注使用SQL语言进行操作。我们将首先简要介绍Go语言与数据库的连接方式,然后详细讲解如何在Go中执行SQL查询、插入、更新和删除操作。此外,还将讨论如何处理查询结果以及处理可能遇到的错误和异常。
|
6月前
|
SQL 存储 缓存
【数据库语言SPL】写着简单跑得又快的数据库语言 SPL
【数据库语言SPL】写着简单跑得又快的数据库语言 SPL
28 0
|
6月前
|
存储 关系型数据库 分布式数据库
向量数据库和普通关系型数据库的区别,LAXCUS支持哪种数据库?
向量数据库和普通关系型数据库的区别,LAXCUS支持哪种数据库?
|
8月前
|
存储 SQL Oracle
数据库的相关概念
数据库的相关概念
37 0
|
9月前
|
存储 SQL 安全
数据库视频总结之概念篇
数据库视频总结之概念篇
|
9月前
|
存储 SQL Oracle
1.数据库的基本概念
1.数据库的基本概念
81 3
|
11月前
|
SQL 存储 缓存
写着简单跑得又快的数据库语言 SPL
写着简单跑得又快的数据库语言 SPL
106 0
|
存储 SQL BI
开源 SPL 打破数据库计算的封闭性
开源 SPL 打破数据库计算的封闭性
开源 SPL 打破数据库计算的封闭性
|
数据库
数据库的基础概念
总结了一些数据库的基础概念
86 1