¿Cómo incluir la fecha de finalización en un DatePeriod?

2 minutos de lectura

Estoy tratando de obtener un intervalo de fechas para todos los días laborables de esta semana. He escrito el siguiente código para hacerlo.

Código

$begin = new DateTime('monday this week'); 2016-07-04
$end = clone $begin;
$end->modify('next friday'); // 2016-07-08

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval, $end);



foreach($daterange as $date) {
    echo $date->format('Y-m-d')."<br />";
}

Producción

  • 2016-07-04
  • 2016-07-05
  • 2016-07-06
  • 2016-07-07

En la salida falta el viernes. Puedo arreglar esto haciendo $end->modify('next saturday') pero me preguntaba por qué el último día de un DatePeriod no está incluido en la gama.

  • Estás preguntando dos cosas. Has respondido a la primera pregunta, o bien necesitas modify('+1') o para inicializar next saturday para incluir el último día. ¿Por qué no se incluye la última fecha o por qué no hay una bandera como DatePeriod::EXCLUDE_START_DATE a INCLUDE_END_DATENo sé…

    – cm

    6 de julio de 2016 a las 14:31

avatar de usuario
RiggsFolly

El iterador parece verificar la hora y la fecha, excluye el elemento final si la hora en la fecha final es menor o igual que la hora en la fecha de inicio.

Así que asegúrese de que la hora de la fecha de finalización sea al menos un segundo mayor que la de la fecha de inicio.

// this will default to a time of 00:00:00
$begin = new DateTime('monday this week'); //2016-07-04

$end = clone $begin;

// this will default to a time of 00:00:00    
$end->modify('next friday'); // 2016-07-08

$end->setTime(0,0,1);     // new line

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval, $end);

foreach($daterange as $date) {
    echo $date->format('Y-m-d')."<br />";
}

  • Exactamente lo que estaba buscando. El razonamiento por el cual se omite el último día. Aún así, es un valor predeterminado estúpido.

    – Pedro

    7 julio 2016 a las 14:01


  • Creo que es una decisión de diseño. Como no quiere fracciones en sus días, entonces siempre toma el límite inferior.

    – Eugenio

    23 de julio de 2019 a las 13:45

avatar de usuario
nueva era

Prueba este código

<?php
$begin = new DateTime('2016-07-04');
$end = clone $begin;
$end->modify('next friday'); // 2016-07-08
$end->modify('+1 day');

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval, $end);

foreach ($daterange as $date) {
    echo $date->format('Y-m-d') . PHP_EOL;
}

¿Ha sido útil esta solución?