2024年PHP开发者大会日本站

DateInterval 类

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

简介

表示日期间隔。

日期间隔存储固定时间量(以年、月、日、小时等为单位)或相对时间字符串,格式与DateTimeImmutableDateTime构造函数支持的格式相同。

更具体地说,DateInterval类对象的中的信息是指示从一个日期/时间到另一个日期/时间的指令。此过程并非总是可逆的。

创建DateInterval对象的一种常用方法是通过DateTimeInterface::diff()计算两个日期/时间对象的差值。

由于没有明确定义的方法来比较日期间隔,因此DateInterval实例是不可比较的

类概要

class DateInterval {
/* 属性 */
public int $y;
public int $m;
public int $d;
public int $h;
public int $i;
public int $s;
public float $f;
public int $invert;
public mixed $days;
/* 方法 */
public __construct(string $duration)
public static createFromDateString(string $datetime): DateInterval
public format(string $format): string
}

属性

警告

下面列出的可用属性取决于PHP版本,应视为只读

y

年数。

m

月数。

d

天数。

h

小时数。

i

分钟数。

s

秒数。

f

微秒数,作为秒的分数。

invert

如果间隔表示负时间段,则为1,否则为0。参见DateInterval::format()

days

如果DateInterval对象是由DateTimeImmutable::diff()DateTime::diff()创建的,则这是起始日期和结束日期之间完整天数的总数。否则,days将为false

from_string

如果DateInterval对象是由DateInterval::createFromDateString()创建的,则此属性的值将为true,并且date_string属性将被填充。否则,该值将为false,并且yfinvertdays属性将被填充。

date_string

用作DateInterval::createFromDateString()参数的字符串。

变更日志

版本 描述
8.2.0 为使用DateInterval::createFromDateString()方法创建的DateInterval实例添加了from_stringdate_string属性。
8.2.0 只有yfinvertdays可见。
7.4.0 DateInterval实例现在是不可比较的;以前,所有DateInterval实例都被认为是相等的。
7.1.0 添加了f属性。

目录

添加注释

用户贡献注释 3 条注释

cb
2 年前
如果要反转日期间隔,请使用 array_reverse 和 iterator_to_array。我发现使用 invert 并不可靠。

<?php
$start_date
= date_create("2021-01-01");
$end_date = date_create("2021-01-05"); // 如果要包含此日期,请加1天

$interval = DateInterval::createFromDateString('1 day');
$daterange = new DatePeriod($start_date, $interval ,$end_date);

function
show_dates ($dr) {
foreach(
$dr as $date1){
echo
$date1->format('Y-m-d').'<br>';
}
}

show_dates ($daterange);

echo
'<br>';

// 反转数组

$daterange = array_reverse(iterator_to_array($daterange));

show_dates ($daterange);

?>

结果
2021-01-01
2021-01-02
2021-01-03
2021-01-04

2021-01-04
2021-01-03
2021-01-02
2021-01-01
[email protected]
10个月前
我使用的更简单的加减示例。

<?php
$Datetime
= new Datetime('NOW', new DateTimeZone('America/Bahia'));
$Datetime->add(DateInterval::createFromDateString('2 day'));

echo
$Datetime->format("Y-m-d H:i:s");
?>
[email protected]
4个月前
有一种方便的方法可以通过将间隔添加到0日期并比较日期来比较间隔

<?php

function compare(DateInterval $first, DateInterval $second): int
{
$firstDate = (new DateTime())->setTimestamp(0)->add($first);
$secondDate = (new DateTime())->setTimestamp(0)->add($second);

return
$firstDate <=> $secondDate;
}

echo
compare(new DateInterval('P2D'), new DateInterval('PT48H')) . PHP_EOL;
echo
compare(DateInterval::createFromDateString('2 days'), DateInterval::createFromDateString('48 hours')) . PHP_EOL;
echo
compare(DateInterval::createFromDateString('2 days'), DateInterval::createFromDateString('49 hours')) . PHP_EOL;
echo
compare(DateInterval::createFromDateString('2 days'), DateInterval::createFromDateString('47 hours')) . PHP_EOL;

?>

输出
0
0
-1
1
To Top