【问题标题】:Check that recurrent event, that happens same time (but can be repeated in different days) cross itself检查同一时间发生的重复事件(但可以在不同的日子重复)交叉自身
【发布时间】:2013-12-24 04:39:13
【问题描述】:

我有一个事件,它有开始日期、“2013-12-06 21:00:00”、持续时间和重复天数位掩码。 问题是用户可以指定持续时间 > 24 小时,并选择事件将自行交叉的重复天数。

例如

  1. 活动持续时间为 25 小时,用户选择每天重复一次,因此它会自行交叉。
  2. 事件持续时间为 49 小时,用户选择星期一和星期三,因此事件将再次交叉。

有必要考虑验证应该包括在周一和周日的事件交叉检查。

能否请您查看我的解决方案?也许它可以以某种方式进行优化?

// Input params
$start = '2013-12-06 12:42:00';
$duration = 60 * 60 * 24 + 1; // specify duration
$days = '1000001'; // monday is at 0 position, sunday is at 6

// Loop internal vars
$dayLength = 60 * 60 * 24;
$loopStart = strtotime($start);
// had to take 8 days to check all week
$loopEnd   = $loopStart + ($dayLength * 8); 

$previousDateEnd = null;
for ($loop = $loopStart; $loop < $loopEnd; $loop += $dayLength) {

    $weekday = date('N', $loop) - 1;

    if ($days{$weekday}) {
        if (!is_null($previousDateEnd) && $loop < $previousDateEnd) {
            die('Event cross itself!');
        }
        $previousDateEnd = $loop + $duration;
    }
}

UPD:我的代码包含一个错误,如果我尝试这样的输入参数,它将找不到事件交叉:

$start = '2013-12-06 12:42:00';
$duration = 60 * 60 * 24 * 2 + 1;
$days = '0001010'; // if one day is not just after another - it does not detect cross!

【问题讨论】:

    标签: php validation date recurrence


    【解决方案1】:

    优化版本,修复了错误,有问题描述。

    // Input params
    $start = '2013-12-06 12:42:00';
    $duration = 60 * 60 * 24 * 3;
    $repeatDays = '0001001'; // monday is at 0 position, sunday is at 6
    
    $requiredDaysOffset = ceil($duration / (60 * 60 * 24)) - 1;
    for($i = 0; $i < 7; $i++) {
        if ($repeatDays[$i]) {
            echo 'index: ' . $i . ' ';
    
            // Check that next $requiredDaysOffset days are disabled
            $pos = $i;
            echo 'check next ' . $requiredDaysOffset . ' days: ';
            for($j = 0; $j < $requiredDaysOffset; $j++) {
                $pos = $pos < 6 ? ($pos + 1) : 0;
                echo "\npos: " . $pos . " ? " . $repeatDays{$pos};
                if ($repeatDays{$pos}) {
                    echo " cross!";
                }
    
            }
    
            echo "\n";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2019-07-23
      • 1970-01-01
      • 2021-03-12
      • 2017-11-12
      相关资源
      最近更新 更多