PHP中日期差异:从简单到专业的5种方法

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

如何计算PHP中两个日期之间的差异:从新手到专家

\n\n

您是否曾问过自己:“从我上次休假过去了多少天?” 或 “网站上的促销活动还有多少小时结束?”?如果您是PHP开发者,这些问题就变成了一个任务:如何计算两个日期之间的差异。

\n\n

这个问题是Stack Overflow上最热门的问题之一,拥有数千次浏览量。这并非偶然:在PHP中处理日期可能很棘手。闰年、时区、不同的格式——所有这些都可能破坏即使是最精心设计的代码。

\n\n

在本文中,我们将探讨5种经过验证的PHP日期差异计算方法——从最简单到最专业。您将了解何时使用哪种方法,并获得现成的代码示例。

\n\n

1. 经典方法:strtotime() 和简单算术

\n\n

最古老且直观的方法是将日期转换为Unix时间戳(timestamp),使用函数strtotime(),然后简单地将一个数减去另一个数。

\n\n
<?php\n$date1 = strtotime('2024-01-15');\n$date2 = strtotime('2024-03-20');\n\n$diff_seconds = $date2 - $date1;\n$diff_days = floor($diff_seconds / (60 * 60 * 24));\n\necho "天数差: " . $diff_days; // 输出: 65\n?>
\n\n

优点:简单,适用于任何PHP版本。

\n

缺点:不考虑时区,1970年之前的日期有问题,没有内置对月和年的支持(因为它们的长度不同)。

\n\n

这种方法适用于快速临时计算,但对于严肃的项目,最好使用更现代的工具。

\n\n

2. 现代标准:DateTime类和diff()方法

\n\n

从PHP 5.2开始,我们有了强大的DateTime类。这是处理日期的瑞士军刀。diff()方法返回一个DateInterval对象,其中包含关于差异的所有信息。

\n\n
<?php\n$date1 = new DateTime('2024-01-15');\n$date2 = new DateTime('2024-03-20');\n\n$interval = $date1->diff($date2);\n\necho "差异: " . $interval->days . " 天"; // 65\necho "或 " . $interval->m . " 个月和 " . $interval->d . " 天"; // 2个月和5天\n?>
\n\n

DateInterval提供以下属性:

\n
    \n
  • y — 年
  • \n
  • m — 月
  • \n
  • d — 日
  • \n
  • h — 时
  • \n
  • i — 分
  • \n
  • s — 秒
  • \n
  • days — 总天数(最有用的!)
  • \n
  • invert — 标志:0如果第一个日期更早,1如果更晚
  • \n
\n\n

这种方法考虑了闰年,并能正确处理不同的日历特性。这正是PHP官方文档推荐的方法。

\n\n

3. 格式化差异:如何显示“2年3个月10天”

\n\n

通常我们不仅需要获取一个数字,还需要为用户美观地格式化差异。DateInterval对象的format()方法可以帮到您。

\n\n
<?php\n$birthday = new DateTime('1990-05-15');\n$today = new DateTime();\n\n$age = $birthday->diff($today);\n\necho $age->format('%y年 %m个月 %d天');\n// 示例:34年 2个月 3天\n?>
\n\n

格式说明符:

\n
    \n
  • %y — 年
  • \n
  • %m — 月
  • \n
  • %d — 日
  • \n
  • %h — 时
  • \n
  • %i — 分
  • \n
  • %s — 秒
  • \n
  • %a — 总天数(days的替代)
  • \n
  • %r — 如果差异为负,则显示“减号”
  • \n
\n\n

想要“天/天/天”的词形变化?您需要编写自己的逻辑。

博客

书籍推荐