使用Carbon生成多个日期,其间隔在一定范围内,但仅限于未来的日期

问题描述 投票:0回答:1

我需要根据时间间隔(例如每周、每两周、每月...)在两个日期之间生成多个日期,但我只需要将来的日期。

为此,我使用 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;

预计日期:

  • 2024-06-02
  • 2025-06-02
  • 2026-06-02
  • 2027-06-02

虽然在这种情况下,只有当我将结束日期设置为 2029-04-01 时它才有效,这对我来说没有意义,因为最后一个日期已经是 2027 年了。

php date php-carbon php-8.3
1个回答
0
投票

您使用的语法对我来说看起来有点复杂,如果您遇到问题,也许更简单的东西会起作用。文档显示了 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
© www.soinside.com 2019 - 2024. All rights reserved.