PHP Conference Japan 2024

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