发生的算法

时间:2012-12-07 15:16:35

标签: php algorithm

有人可以帮助我找出如果当前一周内发生的事情。

我有以下变量:start_date,end_date,current_date week_occurrence。

我有一个返回发生次数

的函数
// will return the number of weeks between start - end
function get_weeks_count($start , $end) {
       return floor(abs(strtotime($start) - strtotime($end)) / 604800);    
    }

现在我必须知道当前日期是否是有效日期。

我有一个条目,每隔N周发生一次。如何知道N是有效的。

不太抽象:如果我们在12月份,并且每3周发生一次,则start_date为1st,end_date为12月30日)

它将返回:

 TRUE  for 1st week

 FALSE for the second week

 FALSE for the third week

 TRUE  for the last week

2 个答案:

答案 0 :(得分:0)

以下是我如何解决问题 - 这适用于每隔n周的事件。

$n = $week_occurrence;
$occurrence = false;

// To begin, get the number of weeks between the start and current dates.
$weeks = get_weeks_count($start_date , $current_date); // Using the function you already have

// Now check if $weeks == 0
if ($weeks == 0) {
    $occurrence = true;

// If not, check if $weeks is divisible by $n without any remainder
} else if ($weeks % $n == 0) {
    $occurrence = true;
}

如果$occurrence仍为假,则当前周不在正确的发生范围内,如果是,则该周确实属于范围。

实际上我们在这里所做的就是检查自开始日期以来的当前周数是否等于零(我们仍然在第一周)或者可以被没有余数的事件整除。

我希望这会有所帮助。

P.S。我只回答了你提出的具体问题。但是,如果您想了解更多关于如何使用这个前提可以用于安排等等,那么请随意提问,我会相应地扩展我的答案

答案 1 :(得分:0)

DateTimeDateInterval的组合可以帮助您轻松实现这一目标。

function get_occurences(DateTime $start, DateTime $end, DateInterval $period) {
    $weeks = array();
    $cursor = clone $start;
    $rate = DateInterval::createFromDateString('1 week');
    do {
        /* We can check to see if it's within the occurrence period */
        if ($cursor == $start) {
            $isOccurrence = true;
            $start->add($period); // Move the start period up
        } else {
            $isOccurrence = false;
        }
        $weeks[$cursor->format('Y-m-d')] = $isOccurrence;
    } while($cursor->add($rate) < $end);
    return $weeks;
}

$period = DateInterval::createFromDateString('3 week');
$start = new DateTime('2012-12-01');
$end = new DateTime('2012-12-30');
/* From this array you can get both the number of occurrences as well as their respective dates*/
var_dump(get_occurences($start, $end, $period));

/** Output:

    array(5) {
      ["2012-12-01"]=>
      bool(true)
      ["2012-12-08"]=>
      bool(false)
      ["2012-12-15"]=>
      bool(false)
      ["2012-12-22"]=>
      bool(true)
      ["2012-12-29"]=>
      bool(false)
    }

*/