如何使用Carbon获取日期范围内的所有星期五

5
我使用这个函数来获取两个日期之间的所有星期五:
public function getFridaysInRange($dateFromString, $dateToString)
{
    $dateFrom = new \DateTime($dateFromString);
    $dateTo = new \DateTime($dateToString);
    $dates = [];

    if ($dateFrom > $dateTo) {
        return $dates;
    }

    if (1 != $dateFrom->format('N')) {
        $dateFrom->modify('next friday');
    }

    while ($dateFrom <= $dateTo) {
        $dates[] = $dateFrom->format('Y-m-d');
        $dateFrom->modify('+1 week');
    }

    return $dates;
}

$this->getFridaysInRange('2017-01-01','2017-01-30');

结果:

array:4 [▼
  0 => "2017-01-06"
  1 => "2017-01-13"
  2 => "2017-01-20"
  3 => "2017-01-27"
]

有没有类似上述的 carbon 函数?

虽然这不是真正的Carbon,而且可悲的是甚至不是周五,但你可能会发现它有用:https://dev59.com/fWw05IYBdhLWcg3wv0N6 - hradecek
无论如何,浏览http://carbon.nesbot.com/docs/,我认为没有像你的单个函数:)。 - hradecek
2个回答

10

你可以像这样使用Carbon的全部功能:

$fridays = [];
$startDate = Carbon::parse($fromDate)->next(Carbon::FRIDAY); // Get the first friday.
$endDate = Carbon::parse($toDate);

for ($date = $startDate; $date->lte($endDate); $date->addWeek()) {
    $fridays[] = $date->format('Y-m-d');
}

2
以防有人决定使用此代码,请注意:如果开始日期是星期五,则 ->next(Carbon::FRIDAY) 将不会获取到“第一个”星期五。next() 会忽略第一天并跳到“下一个”日期。我不确定获取“第一个”星期五的最佳方法是什么,但我使用了类似以下的代码:->sub("1 Day")->next("Friday") - Kyle

3
对 Alexey Mezenin 的答案进行轻微修改,如果当前日期是星期五,则将其包括在内。
$fridays = [];
$startDate = Carbon::parse($fromDate)->modify('this friday'); // Get the first friday. If $fromDate is a friday, it will include $fromDate as a friday
$endDate = Carbon::parse($toDate);

for ($date = $startDate; $date->lte($endDate); $date->addWeek()) {
    $fridays[] = $date->format('Y-m-d');
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接