PHP Conference Japan 2024

DateTimeInterface::diff

DateTimeImmutable::diff

DateTime::diff

date_diff

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DateTimeInterface::diff -- DateTimeImmutable::diff -- DateTime::diff -- date_diff返回两个DateTime对象之间的差值

描述

面向对象风格

public DateTimeInterface::diff(DateTimeInterface $targetObject, bool $absolute = false): DateInterval
public DateTimeImmutable::diff(DateTimeInterface $targetObject, bool $absolute = false): DateInterval
public DateTime::diff(DateTimeInterface $targetObject, bool $absolute = false): DateInterval

过程式风格

date_diff(DateTimeInterface $baseObject, DateTimeInterface $targetObject, bool $absolute = false): DateInterval

返回两个DateTimeInterface对象之间的差值。

参数

datetime

要比较的日期。

absolute

是否强制区间为正数?

返回值

DateInterval对象表示两个日期之间的差值。

absolute参数只影响DateInterval对象的invert属性。

返回值更具体地表示应用于原始对象($this$originObject)以达到$targetObject的时钟时间间隔。此过程并非总是可逆的。

该方法知道DST(夏令时)切换,因此可以返回一个24小时30分钟的间隔,如示例之一所示。如果要使用绝对时间进行计算,则需要先将$this/$baseObject$targetObject都转换为UTC。

示例

示例 #1 DateTimeImmutable::diff() 示例

面向对象风格

<?php
$origin
= new DateTimeImmutable('2009-10-11');
$target = new DateTimeImmutable('2009-10-13');
$interval = $origin->diff($target);
echo
$interval->format('%R%a days');
?>

过程式风格

<?php
$origin
= date_create('2009-10-11');
$target = date_create('2009-10-13');
$interval = date_diff($origin, $target);
echo
$interval->format('%R%a days');
?>

以上示例将输出

+2 days

示例 #2 DateTimeInterface::diff() 在DST切换期间

<?php
$originalTime
= new DateTimeImmutable("2021-10-30 09:00:00 Europe/London");
$targetTime = new DateTimeImmutable("2021-10-31 08:30:00 Europe/London");
$interval = $originalTime->diff($targetTime);
echo
$interval->format("%H:%I:%S (Full days: %a)"), "\n";
?>

以上示例将输出

24:30:00 (Full days: 0)

示例 #3 DateTimeInterface::diff() 范围

该方法返回的值是从$this$targetObject的精确时间量。因此,将1月1日与12月31日进行比较返回364天,而不是365天(对于非闰年)。

<?php
$originalTime
= new DateTimeImmutable("2023-01-01 UTC");
$targetTime = new DateTimeImmutable("2023-12-31 UTC");
$interval = $originalTime->diff($targetTime);
echo
"Full days: ", $interval->format("%a"), "\n";
?>

以上示例将输出

Full days: 364

示例 #4 DateTime 对象比较

注意:

DateTimeImmutableDateTime 对象可以使用 比较运算符 进行比较。

<?php
$date1
= new DateTime("now");
$date2 = new DateTime("tomorrow");

var_dump($date1 == $date2);
var_dump($date1 < $date2);
var_dump($date1 > $date2);
?>

以上示例将输出

bool(false)
bool(true)
bool(false)

参见

  • DateInterval::format() - 格式化区间
  • DateTime::add() - 使用添加的天数、月数、年数、小时数、分钟数和秒数来修改 DateTime 对象
  • DateTime::sub() - 从 DateTime 对象中减去一定数量的天数、月数、年数、小时数、分钟数和秒数
添加笔记

用户贡献笔记

此页面没有用户贡献的笔记。
To Top