Нужен первый и последний день периода datetime - PullRequest
0 голосов
/ 13 февраля 2020

Я работаю с Углеродным периодом, чтобы получить интервалы 'N' дней между двумя датами.

В итерациях для каждого периода мне нужно знать, как получить первый и последний день каждого периода.

Например:

$period = CarbonPeriod::create('2019-10-01', '30 days', '2020-02-15');
// What I need is
// Period 1: from 2019-10-01 to 2019-10-31
// Period 2: from 2019-11-01 to 2019-11-30
// Period 3: from 2019-12-01 to 2019-12-31
// Period 4: from 2020-01-01 to 2020-01-31
// Period 5: from 2020-02-01 to 2020-02-15

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Сначала вы должны использовать 1 month в качестве интервала вместо 30 days:

$period = CarbonPeriod::create('2019-10-01', '1 month', '2020-02-15');

Затем вы можете использовать метод endOfMonth(), чтобы получить ожидаемый результат:

$dates = [];

foreach ($period as $index => $date) {
    $dates[] = sprintf("Period %s: from %s to %s",
        $index + 1,
        $date->toDateString(),
        $period->getEndDate()->min($date->endOfMonth())->toDateString()
    );
}
1 голос
/ 13 февраля 2020

Не думаю, что вы можете получить дату начала / окончания каждого периода, но вы можете использовать копию / установщик, чтобы получить следующий день конца периода.

$period = CarbonPeriod::create('2019-10-01', '30 days', '2020-02-15');
$start = null;
foreach($period as $key=>$date) {
    if(!$start) {
        echo "Start 1 : ".$period->getStartDate()->toDateString(). " End : ".$date->toDateString()."\n";
        $start = $date->copy()->addDay();
    } else {
        echo "Start 2 : ".$start->toDateString(). " End : ".$date->toDateString()."\n";
    }
    $start = $date->copy()->addDay();
}
if($start->lt($period->getEndDate())) {
    echo "Start : ".$start->toDateString(). " End : ".$period->getEndDate()->toDateString()."\n";
}
//Start : 2019-10-01 End : 2019-10-01
//Start : 2019-10-02 End : 2019-10-31
//Start : 2019-11-01 End : 2019-11-30
//Start : 2019-12-01 End : 2019-12-30
//Start : 2019-12-31 End : 2020-01-29
//Start : 2020-01-30 End : 2020-02-15

С 2020- 01-30 - 2020-02-15 - это не 30 дней, это не интервал. Вы должны вручную проверить это, добавить его, как в последних нескольких строках, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...