為什么編程語言中日期能夠實現加減法
一.概要
-
日期類型在編程語言中內部是通過number 存儲的
-
日期類型加減實際是數字的加減
-
多數編程語言的日期開始時間是 1970-01-01 00:00:00
二. 為什么多數編程語言的開始日期是從1970-01-01 00:00:00 開始
通過查閱資料一般存在兩種解釋
-
多數編程語言起源于UNIX,UNIX系統的時間紀元是1970-01-01 00:00:00,即所為的UNIX時間戳。
-
最初計算機都是32位操作系統,時間需要通過number存儲,32位能表示***數字為2147483647。一年365天的總秒數位 31536000 ,兩者相除得68.1.所以如果從0000-00-00 00:00:00 算起的話,計算機到1901年12月13日就溢出了。而選用1970年的,可以支持到2038年。
這兩種解釋,我個人比較認可UNIX時間紀元的說法,畢竟UNIX出現在這一年,作為UNIX的研發者需要紀念這個重要的日子。
三.采用的UNIX時間紀元的開發語言
1.JAVA
文檔地址:http://docs.oracle.com/javase/8/docs/api/java/util/Date.html#Date
不過對于中國開發者,通過 System.Out.Println(new Date(0)); ,控制臺打印的時間是1970-01-01 08:00:00 ,這個是因為中國處于東8區的緣由。對于程序內部存儲值無影響。
2.JavaScript
文檔地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date
3.Python
文檔地址: https://docs.python.org/3/library/datetime.html#date-objects
4.ORACLE
文檔地址:http://docs.oracle.com/cd/E11882_01/appdev.112/e13995/oracle/sql/TIMESTAMP.html
5.PHP
文檔地址:http://php.net/manual/en/function.time.php
四 .沒采用UNIX時間戳的語言
1.基于 .Net 類庫的語言
默認采用int64位來表示時間戳,并且精確到100ns,開始日期點為0001-01-01 00:00:00.000。
文檔地址:https://msdn.microsoft.com/zh-cn/library/z2xf7zzk(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1
2.VBScript
文檔地址:https://www.microsoft.com/china/vbscript/vbstutor/vbsdatatype.htm
這個開始時間很奇怪,從API來看,開始時間是從0100-01-01 00:00:00
不過從代碼測試來看,開始時間是從1899-12-30 0 :00:00 開始
五.有關EXCEL 日期系統
在office excel中存在兩種日期格式1900 和 1904,即日期的開始點為 1900-01-01 00:00:00 和 1904-01-01 00:00:00 。一般Excel 默認是按照1900的日期系統,且認為1900年為潤年,1900年2月分 按照29天計算。Excel中存儲值得起始日期是從1開始的,即,1900-01-01 00:00:00 在excel中對應的存儲值為1 (天)。