DatePeriod::__construct

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

DatePeriod::__constructCrea un nuevo objeto DatePeriod

Descripción

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

Crea un nuevo objeto DatePeriod.

Parámetros

start

La fecha de inicio del periodo.

interval

El intervalo entre repeticiones dentro del periodo.

recurrences

El número de repeticiones.

end

La fecha final del periodo.

isostr

Una especificación ISO 8601 del intervalo de repetición.

options

Se puede establecer a DatePeriod::EXCLUDE_START_DATE para excluir la fecha de inicio del conjunto de fechas de repetición dentro del periodo.

Historial de cambios

Versión Descripción
5.5.8 El tipo de end se cambió a DateTimeInterface. Anteriormente era DateTime.
5.5.0 start se cambió a DateTimeImmutable. Anteriormente era DateTime.

Ejemplos

Ejemplo #1 Ejemplo de DatePeriod

<?php
$inicio
= new DateTime('2012-07-01');
$intervalo = new DateInterval('P7D');
$fin = new DateTime('2012-07-31');
$repeticiones = 4;
$iso = 'R4/2012-07-01T00:00:00Z/P7D';

// Todos estos periodos son equivalentes.
$periodo = new DatePeriod($inicio, $intervalo, $repeticiones);
$periodo = new DatePeriod($inicio, $intervalo, $fin);
$periodo = new DatePeriod($iso);

// Al recorrer el objeto DatePeriod, se imprimen todas
// las fechas de repetición dentro del periodo.
foreach ($periodo as $fecha) {
echo
$fecha->format('Y-m-d')."\n";
}
?>

El resultado del ejemplo sería:

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

Ejemplo #2 Ejemplo de DatePeriod con DatePeriod::EXCLUDE_START_DATE

<?php
$inicio
= new DateTime('2012-07-01');
$intervalo = new DateInterval('P7D');
$fin = new DateTime('2012-07-31');

$periodo = new DatePeriod($inicio, $intervalo, $fin,
DatePeriod::EXCLUDE_START_DATE);

// Al recorrer el objeto DatePeriod, se imprimen todas
// las fechas de repetición dentro del periodo.
// Observe que, en este caso, 2012-07-01 no se imprime.
foreach ($periodo as $fecha) {
echo
$fecha->format('Y-m-d')."\n";
}
?>

El resultado del ejemplo sería:

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

Notas

No se admiten repeticiones de números sin límite tal como se especifca en la sección 4.5 de la ISO 8601, "Recurring time interval", esto es, no funcionará el paso de "R/..." como isostr ni el paso de null como end.

add a note add a note

User Contributed Notes 3 notes

up
34
simon dot kohlmeyer at mayflower dot de
13 years ago
I found two things useful to know that aren't covered here.

1. endDate is excluded:

<?php
$i
= new DateInterval('P1D');
$d1 = new Datetime();
$d2 = clone $d1; $d2->add($i);
foreach(new
DatePeriod($d1, $i, $d2) as $d) {
    echo
$d->format('Y-m-d H:i:s') . "\n";
}
?>

Will output:
2010-11-03 12:39:53

(Another one because I got it wrong at first)
2. For the first form, recurrences really means REcurrences, not occurences.

<?php
$i
= new DateInterval('P1D');
$d = new Datetime();
foreach(new
DatePeriod($d, $i, 1) as $d) {
    echo
$d->format('Y-m-d H:i:s') . "\n";
}
?>

Will output:
2010-11-03 12:41:05
2010-11-04 12:41:05
up
14
lars at hp-designs dot com
11 years ago
When you add the time 23:59:59 to the end DateTime object something like the following then the end date will be included in the period:

<?php
$date_start
= new DateTime('2012-03-12');
$date_end = new DateTime('2012-03-22 23:59:59');

$interval = '+2 days';
$date_interval = DateInterval::createFromDateString($interval);

$period = new DatePeriod($date_start, $date_interval, $date_end, DatePeriod::EXCLUDE_START_DATE);

foreach(
$period as $dt) {
echo
$dt->format('d/m');
}
?>

OUTPUT:
14/03
16/03
18/03
20/03
22/03
up
0
youssef dot benhssaien at gmail dot com
4 years ago
The parameter isostr should accept an ISO 8601 format, but doing this is not work :
<?php
      $dateStart
= date_create('first day of next month this year');

     
$isoStr = $dateStart ->format(DateTimeInterface::ISO8601);
     
$datePeriod = new DatePeriod("R10/{$isoStr}/P1M");
    
// Throw Exception : DatePeriod::__construct(): Unknown or bad format (R10/2020-02-01T22:52:26+0000Z/P1M)
    
     // While doing it by this way works
   
$datePeriod = new DatePeriod($dateStart , \DateInterval::createFromDateString("+1 month"), 10);
?>
To Top