【问题标题】:Calculate the next week cycle based on two dates根据两个日期计算下周周期
【发布时间】:2021-08-12 09:56:39
【问题描述】:

我设置了一个事件系统,它循环工作。例如,用户可以以 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"

【问题讨论】:

    标签: php laravel date php-carbon


    【解决方案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 的结果

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

    【讨论】:

    • 非常感谢,这是完美的。我测试过的所有不同周期和周变体似乎都返回了正确的周周期。感谢您的详细回答。我知道模操作数可能会在某个地方发挥作用。就是不知道在哪里!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    相关资源
    最近更新 更多