DatePeriod::__construct

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

DatePeriod::__construct创建一个新的 DatePeriod 对象

说明

public DatePeriod::__construct(
    DateTimeInterface $start,
    DateInterval $interval,
    int $recurrences,
    int $options = 0
)
public DatePeriod::__construct(
    DateTimeInterface $start,
    DateInterval $interval,
    DateTimeInterface $end,
    int $options = 0
)
警告
public DatePeriod::__construct(string $isostr, int $options = 0)

此构造函数变体已弃用,请改用 DatePeriod::createFromISO8601String()

创建一个新的 DatePeriod 对象。

DatePeriod 对象可以用作迭代器,从 start 日期、intervalend 日期或 recurrences 的数量生成多个 DateTimeImmutableDateTime 对象。

返回对象的类等效于 start 对象的 DateTimeImmutableDateTime 祖先类。

参数

start

周期的起始日期。默认情况下包含在结果集中。

interval

周期内递归之间的间隔。

recurrences

递归次数。返回结果的数量比这多一个,因为起始日期默认包含在结果集中。必须大于 0

end

周期的结束日期。默认情况下不包含在结果集中。

isostr

一个 » ISO 8601 重复间隔规范 的子集。

PHP 不支持的一些 ISO 8601 间隔规范功能示例是

  1. 零次出现 (R0/)
  2. 除 UTC (Z) 之外的时区偏移量,例如 +02:00
options

一个位字段,可用于控制起始日期和结束日期的某些行为。

使用 DatePeriod::EXCLUDE_START_DATE,您可以从周期内递归日期集中排除起始日期。

使用 DatePeriod::INCLUDE_END_DATE,您可以将结束日期包含在周期内递归日期集中。

错误/异常

isostr 不能解析为有效的 ISO 8601 周期时,会抛出 DateMalformedPeriodStringException。在 PHP 8.3 之前,这是 Exception

变更日志

版本 说明
8.3.0 现在抛出 DateMalformedPeriodStringException 而不是 Exception
8.2.0 已添加 DatePeriod::INCLUDE_END_DATE 常量。
7.2.19, 7.3.6, 7.4.0 recurrences 现在必须大于 0

示例

示例 #1 DatePeriod 示例

<?php
$start
= new DateTime('2012-07-01');
$interval = new DateInterval('P7D');
$end = new DateTime('2012-07-31');
$recurrences = 4;
$iso = 'R4/2012-07-01T00:00:00Z/P7D';

// 所有这些周期都是等效的。
$period = new DatePeriod($start, $interval, $recurrences);
$period = new DatePeriod($start, $interval, $end);
$period = new DatePeriod($iso);

// 通过迭代 DatePeriod 对象,打印该周期内所有递归日期。
foreach ($period as $date) {
echo
$date->format('Y-m-d')."\n";
}
?>

上面的示例将输出

2012-07-01
2012-07-08
2012-07-15
2012-07-22
2012-07-29

示例 #2 带有 DatePeriod::EXCLUDE_START_DATE 的 DatePeriod 示例

<?php
$start
= new DateTime('2012-07-01');
$interval = new DateInterval('P7D');
$end = new DateTime('2012-07-31');

$period = new DatePeriod($start, $interval, $end,
DatePeriod::EXCLUDE_START_DATE);

// 通过迭代 DatePeriod 对象,打印该周期内所有递归日期。
// 请注意,在这种情况下,不会打印 2012-07-01。
foreach ($period as $date) {
echo
$date->format('Y-m-d')."\n";
}
?>

上面的示例将输出

2012-07-08
2012-07-15
2012-07-22
2012-07-29

示例 #3 展示一年中所有最后一个星期四的 DatePeriod 示例

<?php
$begin
= new DateTime('2021-12-31');
$end = new DateTime('2022-12-31 23:59:59');

$interval = DateInterval::createFromDateString('last thursday of next month');
$period = new DatePeriod($begin, $interval, $end, DatePeriod::EXCLUDE_START_DATE);

foreach (
$period as $dt) {
echo
$dt->format('l Y-m-d'), "\n";
}
?>

上面的示例将输出

Thursday 2022-01-27
Thursday 2022-02-24
Thursday 2022-03-31
Thursday 2022-04-28
Thursday 2022-05-26
Thursday 2022-06-30
Thursday 2022-07-28
Thursday 2022-08-25
Thursday 2022-09-29
Thursday 2022-10-27
Thursday 2022-11-24
Thursday 2022-12-29

注释

ISO 8601 第 4.5 节“重复时间间隔”中指定的无限次重复不受支持,即,既不能传递 "R/..." 作为 isostr,也不能传递 null 作为 end

添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top