根据两个日期计算下周周期

Calculate the next week cycle based on two dates

我设置了一个事件系统,它循环运行。例如,用户可以创建 2、4、6 和 8 周周期的事件。最终这将是用户可定义的。

我需要能够为任何未实际生成的未来事件计算当前周期。

例如如果用户选择了一个 6 周的事件周期,8 月 9 日是第 5 周,8 月 16 日将是第 6 周,23 日将是第 1 周,依此类推,连续循环一周。例如,如果我们一直走到 11 月 15 日,那将再次成为周期第 1 周。

"2021-08-09"
5
"2021-08-16"
6
"2021-08-23"
1
"2021-08-30"
2
"2021-09-06"
3

如果我知道周期的开始和当前日期,那么计算当前周周期的最佳方法是什么?希望这是有道理的?

目前我有以下内容,但是如果我在 5 到 10 年的时间里计算这个,我想一个循环会非常昂贵。

$start = Carbon\Carbon::parse('2021-08-09');
$end = Carbon\Carbon::parse('2021-11-15');

$cycle_weeks = 6;
$current_cycle = 5;

dump("Week - {$start->toDateString()} - Cycle {$current_cycle}");

// Get current cycle week
while ($start->lt($end)) {
    
    $start = $start->addWeeks(1);
    $current_cycle = $current_cycle + 1;
    
    if ($current_cycle > $cycle_weeks) {
        $current_cycle = 1;
    }
    
    dump("Week - {$start->toDateString()} - Cycle {$current_cycle}");
}

这给了我日期,但以每周循环直到结束日期为代价。我想不出一种数学方法 - 如果有的话 - 或许可以根据周差计算出周期?

"Week - 2021-08-09 - Cycle 5"
"Week - 2021-08-16 - Cycle 6"
"Week - 2021-08-23 - Cycle 1"
"Week - 2021-08-30 - Cycle 2"
"Week - 2021-09-06 - Cycle 3"
"Week - 2021-09-13 - Cycle 4"
"Week - 2021-09-20 - Cycle 5"
"Week - 2021-09-27 - Cycle 6"
"Week - 2021-10-04 - Cycle 1"
"Week - 2021-10-11 - Cycle 2"
"Week - 2021-10-18 - Cycle 3"
"Week - 2021-10-25 - Cycle 4"
"Week - 2021-11-01 - Cycle 5"
"Week - 2021-11-08 - Cycle 6"
"Week - 2021-11-15 - Cycle 1"

我认为这可行:

function currentCycle(Carbon $startDate, Carbon $currentDate, int $cycles, int $startCycle) {
    if ($startCycle > $cycles) $startCycle = 1;
    return (($currentDate->diffInWeeks($startDate)+$startCycle-1)%$cycles)+1;
}

想法是:

  • 您得到当前周数和开始周数之间的差异。通常,如果循环从 $startDate 开始,则此数字除以 $cycles 后的余数将为您提供一个从 0 开始的循环数。 PHP 中的除法余数 (mod) 由 % 运算符
  • 给出
  • 由于给定了一个不同的循环作为起点,并且这不是从 0 开始的,因此我们将其减一,例如$startCycle-1 并将此数字添加到 diff 结果中。然后我们通过在末尾添加 +1
  • 将这个基于 0 的结果转换回基于 1 的结果

这应该允许您根据任何开始日期、任何当前日期、该开始日期的任何开始周期以及任何数量的周期来获取周期。