PHP 8 中计算日期差最推荐用 DateTime::diff() 方法,返回 DateInterval 对象,可精确获取年月日等差异并判断正负;也可用 getTimestamp() 相减后除以 86400 计算精确天数。

PHP 8 中用 DateTime 计算日期差,最常用、最推荐的方式是使用 diff() 方法,它返回一个 DateInterval 对象,能精确获取年、月、日、时、分、秒等差异,并支持正负方向判断。
创建两个 DateTime 对象
先实例化两个 DateTime 对象,可以传入字符串(如 '2023-05-10'、'now'、'tomorrow')、时间戳或空参(默认为当前时间):
$date1 = new DateTime('2023-04-01');
$date2 = new DateTime('2023-05-15');调用 diff() 获取时间差
用其中一个对象调用 diff(),传入另一个对象,返回 DateInterval 实例:
$interval = $date2->diff($date1); // $date2 - $date1
注意:$a->diff($b) 表示「$a 减去 $b」的结果,若 $a 更早,结果为负($interval->invert 为 1),可据此判断先后顺序。
立即学习“PHP免费学习笔记(深入)”;
提取并格式化差值
DateInterval 对象包含多个公共属性,例如:
- y:完整年数
- m:剩余月数(在扣除整年后的余下月份)
- d:剩余天数(在扣除整年整月后的余下天数)
- h、i、s:小时、分钟、秒(若含时间)
-
days:总天数(仅当两个 DateTime 均不含时分秒时才可靠;含时间时建议用
getTimestamp()差值换算)
常用输出方式:
echo $interval->format('%y 年 %m 月 %d 天'); // 如:0 年 1 月 14 天
echo $interval->days; // 输出总天数:44(注意:这是绝对值,不反映方向)
if ($interval->invert) {
echo 'date2 比 date1 早';
}计算纯天数差(含时分秒的精确秒级差)
如果只需要总天数(四舍五入或向下取整),或需高精度(比如跨夏令时、闰秒场景),更稳妥的做法是用时间戳:
- 用
getTimestamp()获取 Unix 时间戳(秒数) - 相减后除以 86400 得到小数天数,再用
floor()、round()或intval()处理
$seconds = $date2->getTimestamp() - $date1->getTimestamp(); $days = floor($seconds / 86400); // 向下取整天数
此法不受日历复杂性(如 30/31 天月、闰年)干扰,适合统计“经过多少整天”这类需求。



















