web-dev-qa-db-fra.com

Incrémenter les dates avec du carbone

J'essaie de créer un tableau de dates d'interdiction pour un système de réservation dans Laravel 4. Il y a une ligne de test dans ma base de données avec une date d'entrée au jour du 24/01/2016 et une date de fin du 29/01/2016.

C'est le code qui tire la ligne et parcourt les dates en utilisant Carbon pour incrémenter d'un jour et l'ajouter à un tableau:

$reserved = Reservation::where('property_id', $property->id)->get();

$blackoutDays = [];

foreach($reserved as $r)
{
    $start = new \Carbon\Carbon($r->start_date);
    $end = new \Carbon\Carbon($r->end_date);
    $days = $start->diff($end)->days;

    for($i = 0; $i <= $days; $i++)
    {
        $date = '';
        $date = $start->addDays($i);

        $blackoutDays[] = $date->format('Y-m-j');
    }
}

Ce que j'essaie d'obtenir dans $ blackoutDays, c'est:

["2016-01-24", "2016-01-25", "2016-01-26", "2016-01-27", "2016-01-28", "2016-01-29"]

Mais ce que je reçois en fait, c'est ceci:

["2016-01-24", "2016-01-25", "2016-01-27", "2016-01-30", "2016-02-3", "2016-02-8"]

Est-ce que quelqu'un sait pourquoi cela se produit/comment y remédier? Existe-t-il une meilleure façon de le faire?

8
Kevin Daniel

Vous incrémentez $i à chaque exécution de votre boucle for. Donc, il ajoute 1 dans la première manche, 2 jours dans la seconde, 3 jours dans la troisième et ainsi de suite.

Par conséquent, vous voulez remplacer 

$date = $start->addDays($i);

avec

$date = $start->addDays(1);

L’idée que les jours sont ajoutés à partir de l’objet $start date à chaque appel est vraisemblablement une erreur, mais ce n’est pas le cas, cet objet n’est pas " Immutable ".

13
ArSeN

Pour un résultat plus net, vous pouvez utiliser la méthode addDay ():

$date = $start->addDay();

Mais en fait c'est exactement la même chose. Code source de la méthode addDay ():

/**
 * Add a day to the instance
 *
 * @param int $value
 *
 * @return static
 */
public function addDay($value = 1)
{
    return $this->addDays($value);
}
1
Odin Thunder