PHP有很多方法和函数可以帮助你以各种方式操作日期。在这个快速提示中,我将向你展示如何在PHP中使用DateInterval 类向一个日期添加天数。我们将从DateInterval 的概述开始,然后进入到实际的添加。
DateInterval 类
DateInterval 类对于存储以年、月、小时等为单位的特定时间量非常有用。这个类的构造函数接受以P开头的指定时间间隔的字符串,这个P代表周期。对于包含时间成分的区间,即小时、分钟和秒,你也必须使用字母T。
下表列出了用于指定特定时期的所有字符。
| 字符 | 它所代表的内容 |
|---|---|
| Y | 年 |
| M | 月 |
| W | 周(转换为天) |
| D | 天 |
| H | 小时 |
| M | 分钟 |
| S | 秒 |
你可能已经注意到,M既代表月也代表分,但这种模糊性由我前面提到的字符T来解决。由于分钟代表了我们的时间间隔的组成部分,所以它们前面会有一个T。下面是一些例子来说明问题。
| 字符串 | 时间间隔 |
|---|---|
| P20D | 20天 |
| P5Y | 5年 |
| P2Y3M | 2年零3个月 |
| PT10M | 10分钟 |
| P2Y3MT1H10M | 2年3个月,1小时10分钟 |
在指定持续时间时,有两件事必须记住。
- 在 8.0.0 之前的 PHP 版本中不能将周和日结合起来。从 PHP 8.0.0 起,P1W3D将被解释为 10 天,但在早期版本中则为 3 天。
- 在指定期限时,必须从最大的时间单位移到最小的时间单位。这意味着年总是在月之前,月在日之前,以此类推。
用PHP给日期添加天数DateInterval
现在我们知道了如何指定日期间隔,我们将学习如何在PHP中为一个日期添加天数。我们可以使用DateTime 类的add() 方法。下面是一个例子。
<?php
$date = new DateTime('2021-12-15');
echo $date->format('M d, Y H:i:s');
// Dec 15, 2021 00:00:00
$interval = new DateInterval('P18DT6M');
$date->add($interval);
echo $date->format('M d, Y H:i:s');
// Jan 02, 2022 00:06:00
?>
我们从2021年12月15日开始,将日期作为一个DateTime 对象存储在变量$date 中。加上18天6分钟的间隔,我们就可以看到2022年1月2日的00:06:00。
add() 方法照顾到特定月份的天数,并相应地返回增加的值,所以你不必担心闰年或不同月份有28天、30天或31天。
<?php
$date = new DateTime('2022-01-29');
echo $date->format('M d, Y');
// Jan 29, 2022
$interval = new DateInterval('P25D');
for($i = 0; $i <= 4; $i++) {
$date->add($interval);
echo "\n".$date->format('M d, Y');
}
/*
Feb 23, 2022
Mar 20, 2022
Apr 14, 2022
May 09, 2022
Jun 03, 2022
*/
?>
你可以从下面的例子中看到,当初始日期来自闰年时,输出会发生变化。
<?php
$date = new DateTime('2024-01-29');
echo $date->format('M d, Y');
// Jan 29, 2024
$interval = new DateInterval('P25D');
for($i = 0; $i <= 4; $i++) {
$date->add($interval);
echo "\n".$date->format('M d, Y');
}
/*
Feb 23, 2024
Mar 19, 2024
Apr 13, 2024
May 08, 2024
Jun 02, 2024
*/
?>
在一个表格中同时指定周和日DateInterval
从 PHP 8.0.0 开始,在创建日期区间时将W和D结合在一起是可能的,这意味着不同版本的 PHP 在运行相同的代码时会返回不同的日期。下面是一个例子。
<?php
$date = new DateTime('2024-01-29');
echo $date->format('M d, Y H:i:s')."\n";
$interval = new DateInterval('P2W2DT25H');
for($i = 0; $i <= 4; $i++) {
$date->add($interval);
echo "\n".$date->format('M d, Y H:i:s');
}
?>
这里有两点需要注意,一是W和D一起使用,二是区间内的小时数高于24。这实际上使间隔时间(14+2+1=)为17天零1小时。因此,PHP应该在每次迭代时加上这一点。在 PHP 8.0.3 中运行上述代码时,输出结果与预期一致。
Jan 29, 2024 00:00:00
Feb 15, 2024 01:00:00
Mar 03, 2024 02:00:00
Mar 20, 2024 03:00:00
Apr 06, 2024 04:00:00
Apr 23, 2024 05:00:00
然而,PHP 7.4每次迭代只增加3天1小时,而忽略了2周的时间。
Jan 29, 2024 00:00:00
Feb 01, 2024 01:00:00
Feb 04, 2024 02:00:00
Feb 07, 2024 03:00:00
Feb 10, 2024 04:00:00
Feb 13, 2024 05:00:00
最后的思考
我只提到了add() ,用于在PHP中为日期添加像天和年这样的时间间隔的方法。然而,PHP也有一个sub() 方法,可以用来从一个日期中减去任何时间间隔。这两个方法在修改其值后都会返回同一个DateTime 对象。如果你想防止原始日期的改变,你应该考虑使用DateTimeImmutable 类。