PHP date_add() 函数

date_add() 函数是 DateTime::add() 的过程化别名,用于向 DateTime 对象添加指定的时间间隔。该函数修改原始 DateTime 对象,并返回修改后的对象。

提示: 在 PHP 5.3+ 中,推荐使用面向对象的 DateTime::add() 方法。date_add() 函数提供过程化编程风格。

语法

DateTime date_add ( DateTime $object , DateInterval $interval )

参数说明

参数 描述 必需
$object DateTime 对象,表示要修改的日期时间
$interval DateInterval 对象,表示要添加的时间间隔

返回值

  • 返回修改后的 DateTime 对象
  • 原始 DateTime 对象也会被修改
  • 如果失败则返回 FALSE

示例代码

示例 1:基本用法 - 添加天数

<?php
// 创建一个 DateTime 对象
$date = date_create('2024-03-15');

// 创建一个时间间隔:2天
$interval = new DateInterval('P2D');

// 添加时间间隔
date_add($date, $interval);

// 输出结果
echo date_format($date, 'Y-m-d');
// 输出:2024-03-17
?>

示例 2:添加复杂时间间隔

<?php
// 创建 DateTime 对象
$date = date_create('2024-01-31 14:30:00');

// 创建复杂时间间隔:1个月15天3小时
$interval = new DateInterval('P1M15DT3H');

// 添加时间间隔
date_add($date, $interval);

// 输出结果
echo date_format($date, 'Y-m-d H:i:s');
// 输出:2024-03-15 17:30:00
?>

示例 3:与 DateTime::add() 比较

<?php
// 使用 date_add() 函数(过程化)
$date1 = date_create('2024-03-15');
$interval1 = new DateInterval('P10D');
date_add($date1, $interval1);
echo "date_add: " . date_format($date1, 'Y-m-d') . "<br>";

// 使用 DateTime::add() 方法(面向对象)
$date2 = new DateTime('2024-03-15');
$interval2 = new DateInterval('P10D');
$date2->add($interval2);
echo "DateTime::add: " . $date2->format('Y-m-d');
// 两种方法输出相同:2024-03-25
?>

示例 4:添加负数间隔(减去时间)

<?php
// 创建 DateTime 对象
$date = date_create('2024-03-15');

// 创建负数时间间隔:减去10天
$interval = new DateInterval('P10D');
$interval->invert = 1; // 设置为负数

// 添加负数间隔(实际是减去时间)
date_add($date, $interval);

// 输出结果
echo date_format($date, 'Y-m-d');
// 输出:2024-03-05

// 或者使用 DateInterval::createFromDateString
$date2 = date_create('2024-03-15');
$interval2 = DateInterval::createFromDateString('-2 weeks');
date_add($date2, $interval2);
echo "<br>" . date_format($date2, 'Y-m-d');
// 输出:2024-03-01
?>

示例 5:处理月末日期

<?php
// 创建月末日期
$date = date_create('2024-01-31');

// 添加1个月
$interval = new DateInterval('P1M');
date_add($date, $interval);

// 输出结果(PHP会自动处理月末)
echo date_format($date, 'Y-m-d');
// 输出:2024-02-29(2024年是闰年)

// 再添加1个月
$interval = new DateInterval('P1M');
date_add($date, $interval);
echo "<br>" . date_format($date, 'Y-m-d');
// 输出:2024-03-29(不是31日,因为2月只有29天)
?>

DateInterval 格式说明

DateInterval 构造器使用 ISO 8601 持续时间格式:

P 表示周期(Period)

Y - 年,M - 月,D - 日

T 表示时间(Time)

H - 小时,M - 分钟,S - 秒

示例:

  • P1Y2M10DT2H30M - 1年2个月10天2小时30分钟
  • P10D - 10天
  • PT2H30M - 2小时30分钟
  • P1Y6M - 1年6个月

注意事项

重要提示:
  • date_add() 会修改原始 DateTime 对象
  • 要创建不修改原对象的新对象,可以使用 date_create() 创建副本
  • 添加月份时,PHP 会智能处理月末日期(如1月31日加1个月=2月28/29日)
  • PHP 5.3+ 建议使用面向对象的 DateTime::add() 方法
  • date_add() 返回修改后的对象,可以用于链式调用

常见错误与解决方案

<?php
// 错误示例:直接使用字符串作为间隔
try {
    $date = date_create('2024-03-15');
    // 错误:第二个参数必须是 DateInterval 对象
    // date_add($date, 'P10D'); // 这会报错
} catch (Exception $e) {
    echo "错误: " . $e->getMessage();
}

// 正确做法:先创建 DateInterval 对象
$date = date_create('2024-03-15');
$interval = new DateInterval('P10D');
date_add($date, $interval);
echo "正确结果: " . date_format($date, 'Y-m-d');
?>

实用场景示例

场景1:计算截止日期
<?php
// 项目开始日期
$startDate = date_create('2024-03-15');

// 项目周期:3个月
$projectDuration = new DateInterval('P3M');

// 计算截止日期
$deadline = date_add($startDate, $projectDuration);

echo "项目开始: " . date_format($startDate, 'Y-m-d') . "<br>";
echo "项目周期: 3个月<br>";
echo "预计完成: " . date_format($deadline, 'Y-m-d');
// 输出:2024-06-15
?>
场景2:生成日期序列
<?php
// 生成未来7天的日期
$startDate = date_create('2024-03-15');
$interval = new DateInterval('P1D');

echo "未来7天日期:<br>";
for ($i = 0; $i < 7; $i++) {
    // 复制对象以避免修改原对象
    $currentDate = date_create(date_format($startDate, 'Y-m-d'));
    $interval->days = $i;
    date_add($currentDate, $interval);
    echo date_format($currentDate, 'Y-m-d (l)') . "<br>";
}
?>

相关函数

函数 描述
date_sub() 从 DateTime 对象减去时间间隔
date_diff() 计算两个日期之间的差异
date_modify() 使用字符串修改 DateTime 对象
DateTime::add() 面向对象的日期添加方法