我需要根据时间间隔(例如每周、每两周、每月...)在两个日期之间生成多个日期,但我只需要将来的日期。
为此,我使用 Carbon 2.72.3 库,并提出了以下代码:
$interval = CarbonInterval::week();
$startDate = Carbon::create(2024, 3, 17);
$endDate = Carbon::create(2024, 4, 1);
$amount = 4;
$period = CarbonPeriod::interval($interval)
->setStartDate($startDate)
->addFilter(fn(Carbon $carbon) => $carbon->isFuture(), 'isFuture')
->addFilter(fn(Carbon $carbon) => !$endDate || $carbon->isBefore($endDate))
->setRecurrences($amount);
dd($period->toArray());
不幸的是,这有时有效(意思是:不适用于所有日期/时间间隔),我无法准确说出它在什么条件下有效以及何时无效。
对于上述日期,Carbon 会抛出一个
Carbon\Exceptions\UnreachableException
,并显示消息 Could not find next valid date.
。如果我将金额减少到 1,它会起作用,但仅返回 2024-03-24 作为日期(这是预期的,但不能解决我的问题)。
对于其他数据,例如这个,它按预期工作:它根据与开始日期相关的间隔返回 4 个日期,但仅返回未来的日期。
$interval = CarbonInterval::month();
$startDate = Carbon::create(2022, 6, 2);
$endDate = null;
$amount = 4;
如果我设置了
$endDate = Carbon::create(2024, 4, 1);
,它也会停止工作。我怀疑有时当它无法生成日期的 $amount
时会发生这种情况。但情况似乎并非总是如此,因为以下设置应该能够生成至少 4 个日期,尽管会抛出相同的异常:
$interval = CarbonInterval::year();
$startDate = Carbon::create(2022, 6, 2);
$endDate = Carbon::create(2028, 4, 1);
$amount = 4;
预计日期:
虽然在这种情况下,只有当我将结束日期设置为 2029-04-01 时它才有效,这对我来说没有意义,因为最后一个日期已经是 2027 年了。
您使用的语法对我来说看起来有点复杂,如果您遇到问题,也许更简单的东西会起作用。文档显示了 CarbonPeriod
$startDate = '2022-06-02';
$endDate = '2028-04-01';
$interval = '1 year';
$number = 4;
$count = 0;
$results = [];
$period = new CarbonPeriod($startDate, $interval, $endDate);
foreach ($period as $date) {
if ($date->isPast()) {
continue;
}
$results[] = $date;
$count++;
if ($count >= $number) {
break;
}
}
print_r($results);
并产生您预期的输出:
[date] => 2024-06-02 00:00:00.000000
[date] => 2025-06-02 00:00:00.000000
[date] => 2026-06-02 00:00:00.000000
[date] => 2027-06-02 00:00:00.000000