timestamp只能计算1970年以后的时间,由于需要计算更早的日期,发现PHP也提供了一个DateTime类,但是有问题使用。1582年,由于旧历的准确性,已经累积了十天的偏差,所以跳过了今年的10月5日到10月14日,而10月4日之后直接是10月15日,同时修了一个闰日时间规则,并成为今天使用的公历。现行的公历(拉丁语:CalendariumGregorianum,又译格里高利历、格里高利历、公历、阳历、格里高利历、公历、格里高利历,又称基督教历),是由意大利医师和改革儒略历的哲学家AloysiusLilius,于1582年由罗马天主教教皇格里高利十三世颁布。公历与儒略历相同。公历每四年2月底也有一个闰日,但公历特别规定,除非能被400整除,否则所有世纪年(能被100整除)都不设如此一来,每四百年,公历只有97个闰年,比儒略历少了3个闰年。公历的问题发生在1582年之前,在此之前,应该使用的是旧历,即儒略历。主要区别在于插层方法。但是PHP的DateTime类还是按照新历计算的(或者计算早于新历,不会自动转为儒略历),所以当年份为1300或一百年时,二月的日期是错误的,实际传入的是这一天,会自动转换为3月1日,diff中计算天数差值时会出现错误。而且在实际使用中,对于比历法更早的时间,并没有使用公历的习惯,都是用儒略历来表示的,所以DateTime类的设计就相当于说比calendarchange基本不可能用到,还是得自己处理。(其他语言比如C#提供的日历计算好像也有类似情况)。儒略历是公历的前身,由罗马共和国的独裁者尤利乌斯·凯撒采用埃及亚历山大港的希腊数学家、天文学家索西格尼斯计算的历法。它于公元前45年1月1日实施。取代旧罗马历的日历。一年有12个月,大小月交替,四年一闰,平年有365天。闰年的二月底加一个闰日,年平均长度为365.25天。随着时间的推移累积误差越来越大,1582年以后被教皇格里高利十三世改进,成为公历,沿用至今。儒略历的另一个细节是,儒略历于公元前45年建立,大小月交替。不过5世纪时有一次历法改革,改变了月份的不规则划分和大小月交替(现在的Calendar样式),资料中的描述不是很清楚,容易遗漏(发现这个问题之前我也是求教过的。。)。补充:PHP5+其实有一个日历扩展,如果你需要专业的日历应用,最好使用这个扩展。一般1970之前的应用很少,所以不考虑超长时间的支持。对于这种超长期的历法计算,时间戳时间太接近不合适,公历也太接近,儒略历转现代时间也不方便。在日历上,有一个类似于时间戳的日历算法Julianday。名称与儒略历相似,但不是同一个概念。这是法国学者JosephJustusScliger(1540-1609)在1583年提出的,它是从儒略历公元前4713年1月1日开始的天数,从UTC中午12:00开始计算,非常适合处理超长时间范围问题。
