偶尔的一次,有人问了下我,怎么求某个会员到现在多少岁多少个月了,当时简单的回答到用两个时间戳除以每年的秒数,每个月的秒数,每天的秒数。很明显,这个回答是错的,后来就仔细想了下,确实不好实现,因为考虑到闰年,每个月天数这两个因素,就不是那么好计算的,然后想起了php的date_diff函数,先代码贴出来:
date_default_timezone_set('PRC'); $datetime1 = new DateTime('2012-12-08'); $datetime2 = new DateTime('2011-10-11'); $interval = $datetime1 ->diff($datetime2); echo $interval ->format('%R%a days'),PHP_EOL; echo $interval ->format('%Y-%m-%d'),PHP_EOL;
输出结果为-424 days 01-1-28,也就是说相差了1年1个月28天,然后在看
date_default_timezone_set('PRC'); $datetime1 = new DateTime('2011-12-08'); $datetime2 = new DateTime('2010-10-11'); $interval = $datetime1 ->diff($datetime2); echo $interval ->format('%R%a days'),PHP_EOL; echo $interval ->format('%Y-%m-%d'),PHP_EOL;
输出结果为-423 days 01-1-28,也就是说相差了1年1个月28天,对比两者不难发现,php这样计算是对的,php在计算的过程中考虑到了闰年的问题,但令人奇怪的是,2012年12月8号和2011年10月11号真的是相差1年1个月28天吗?应该不是的,而是1年1个月27天,更奇怪的是
date_default_timezone_set('PRC'); $datetime1 = new DateTime('2010-11-08'); $datetime2 = new DateTime('2010-09-11'); $interval = $datetime1 ->diff($datetime2); echo $interval ->format('%R%a days'),PHP_EOL; echo $interval ->format('%Y-%m-%d'),PHP_EOL;
输出结果为-58 days,00-1-27,也就是说相差了1个月27天
date_default_timezone_set('PRC'); $datetime1 = new DateTime('2010-12-08'); $datetime2 = new DateTime('2010-10-11'); $interval = $datetime1 ->diff($datetime2); echo $interval ->format('%R%a days'),PHP_EOL; echo $interval ->format('%Y-%m-%d'),PHP_EOL;
输出结果为-58 days,00-1-28,也就是说相差了1个月28天,看了这几个例子实在不明白php是怎么算的,这两个结果和我们理解的完全相反,不知道是我理解有误还是php的规则有特殊之处
转载请注明:我是IT » php计算两个日期之间相差的年月日