時間戳只能計算 1970 年後的時間,因爲須要計算更早的日期,發現 PHP 還有提供一個 DateTime類,但在使用中發現有問題。設計
1582年,由於舊曆精度問題,致使已經積累了十天的誤差,,因此此年10月5號~10月14號跳過,10月4號以後直接是10月15號,同時修個置閏規則,成爲現在使用的格里高利曆。ip
現行公曆(拉丁語:Calendarium Gregorianum,又譯格里曆、國瑞歷、額我略曆、格列高利曆、格里高利曆、葛瑞格里曆、格列高歷,也稱基督歷),是由意大利醫生兼哲學家阿洛伊修斯·裏利烏斯改革儒略曆制定的歷法,由羅馬大公教會教宗格列高利十三世在1582年頒行。
格里曆與儒略曆同樣,格里曆也是每四年在2月底置一閏日,但格里曆特別規定,除非能被400整除,全部的世紀年(能被100整除)都不設閏日;如此,每四百年,格里曆僅有97個閏年,比儒略曆減小3個閏年。
格里高利曆get
問題出在1582年以前,以前應該是使用舊曆,也就是儒略曆,主要差別在置閏方法不一樣。
但PHP的DateTime類計算依然是按新曆計算(或者說計算時早於改歷不會自動換算成儒略曆),因此致使1300年之類整百年的時候,二月日期不對,實際傳入這天時,會自動換算成3月1號,diff計算天數差,也會有錯誤。 數學
而且在實際使用中,早於改歷以前的時間並沒用格里曆表式的習慣,都是換成儒略曆表達,因此DateTime類這樣的設計,等於說早於改歷的時間基本不能用的,仍是得本身另外處理一遍。(其餘語言像是C#提供的歷法計算彷佛也存在相似狀況)。方法
儒略曆,是格里曆的前身,由羅馬共和國獨裁官儒略·凱撒採納埃及亞歷山大的希臘數學家兼天文學家索西琴尼計算的歷法,在公元前45年1月1日起執行,取代舊羅馬歷歷法的一種曆法。一年設12個月,大小月交替,四年一閏,平年365日,閏年於二月底增長一閏日,年平均長度爲365.25日。因爲累積偏差隨着時間愈來愈大,1582年後被教皇格里高利十三世改善,變爲格里曆,即沿用至今的公曆。
儒略曆im
還有一個細節就是,儒略曆定製於公元前45年,是大小月交替的,但在5世紀的時候,有一次曆法改革,改變了月份劃分不是規律的大小月交替了(現行日曆樣式),資料上說明並非很清楚,這點很容易遺漏(我也是請教了一下才發現這問題..)。時間戳