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|false
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 属性。

目录

添加笔记

用户贡献笔记 4 笔记

cb
1 年前
如果要反转日期间隔,请使用 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
julio dot necronomicon at gmail dot com
6 个月前
我用来添加或减去的更简单的示例。

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

echo
$Datetime->format("Y-m-d H:i:s");
?>
edgaras at levinson dot lt
13 天前
有一个方便的方法可以比较时间间隔,将它们添加到 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(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
nateb at gurutechnologies dot net
4 年前
许多人评论过在日期时间上执行反向间隔。我个人认为反向年份有点奇怪,所以选择只处理间隔。这是我找到的最简单的方法。

<?php
$one_year
= new DateInterval('P1Y');
$one_year_ago = new DateTime();
$one_year_ago->sub($one_year);
?>

而不是

<?php
$one_year_ago
= new DateInterval( "P1Y" );
$one_year_ago->invert = 1;
$one_year_ago = new DateTime();
$one_year_ago->add($one_year);
?>
To Top