推荐使用 datetime 和 dateinterval 计算天数差:创建两个 datetime 对象,调用 diff() 获取 dateinterval,再取 $interval->days;需校验用户输入日期有效性,注意时区与时间精度问题。

要计算指定日期距离当前日期的天数,PHP 提供了多种简洁可靠的方式,核心是利用 DateTime 类进行时间差计算,避免手动处理闰年、月份天数等复杂逻辑。
使用 DateTime 和 DateInterval 计算天数差(推荐)
这是最标准、可读性高且时区安全的方法:
- 创建两个
DateTime对象:一个表示目标日期,一个表示当前日期(可省略参数,默认为 now) - 调用
diff()方法获取DateInterval对象 - 通过
$interval->days直接获取总天数(自动处理正负)
示例代码:
$targetDate = new DateTime('2025-06-15');
$now = new DateTime();
$interval = $now->diff($targetDate);
echo $interval->days; // 输出:距离今天还有或已过多少天(正数表示目标在将来,负数需自行判断)
// 若只想要绝对天数(不区分过去未来),可用 abs($interval->days)
处理用户输入的日期字符串(带校验)
实际应用中,日期常来自表单或配置,需先验证格式有效性:
- 用
DateTime::createFromFormat()指定格式解析,比new DateTime()更严格 - 检查返回对象是否为
false,避免无效日期(如 '2024-02-30')静默转成其他日期 - 建议统一使用 Y-m-d 格式,兼容性最好
示例:
$dateStr = '2024-12-25';
$dt = DateTime::createFromFormat('Y-m-d', $dateStr);
if (!$dt || $dt->format('Y-m-d') !== $dateStr) {
echo "日期格式错误";
} else {
$days = (int)(($dt->getTimestamp() - time()) / 86400);
echo "距离今天:{$days} 天";
}
注意时区与时间精度问题
默认使用服务器本地时区,可能影响结果。如需统一按 UTC 或指定时区计算:
- 初始化
DateTime时传入new DateTimeZone('Asia/Shanghai') - 或全局设置:
date_default_timezone_set('Asia/Shanghai'); - 仅比较日期(忽略具体时间)?可在创建对象后调用
$dt->setTime(0, 0, 0)归零时分秒
一行快速计算(适合简单脚本)
若只是临时估算,可用时间戳相减再除以 86400:
$days = intval((strtotime('2025-01-01') - time()) / 86400);
注意:此法不推荐用于生产环境,因 strtotime() 对非法格式容错性强(如把 '2024-02-30' 当作 2024-03-01),且未处理时区切换问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











