如何在拉拉维尔中编程'biweekly event'



我有一个系统,用户可以选择某个事件每周、每两周或每月触发一次。

现在,每周和每月都很简单——我每天都有一个cron作业在运行,如果有人将设置设置为"每周",我只需检查当天是否为周一。如果是每月一次,我会检查每月的日期是否为1。

但每两周一次就有点棘手了。我的第一个想法是检查是否是星期一,然后检查自年初以来是否已经有偶数周了。我不能100%确定这一点,但我确实有信心,当一年结束时,你可能会连续两周触发它,或者连续两周不触发它。

我的另一个可能克服这一问题的想法是,检查自过去某个特定日期以来,例如自2020年1月1日以来,是否已经有偶数周了。

在我看来,这两种逻辑都涉及到使用Carbon来获得->diffInDays(),将其除以7,求出结果,并检查结果是偶数还是奇数。我只是想看看这些想法中是否有任何一个是实现"每两周一次"的好方法,或者我是否需要考虑其他事情。

我认为你的第二个想法是可以的。我用1970年1月1日作为过去的日期。

你不需要碳。本地DateTime运行良好。

$strDate = 'today';
//$strDate = '2020-05-04';  //for test
//$strDate = '2020-05-11';  //for test
$curDate = date_create($strDate);
$biweekly = ((int)(date_create('@0')->diff($curDate)->days/7))%2;
//result is 0 or 1
$start = ($biweekly AND $curDate->format('w') == 1); //true for every 2nd Monday

如果你想使用其他一周,那么做:

$start = ($biweekly == 0 AND $curDate->format('w') == 1);

另一种变体采用特定日期,并将所需的工作日作为开始日期。如果从开始日期到当天的天数之差可以被14整除,则有一个2周的周期

$startDate = '2020-05-04';  //a monday
$ev14Days = date_create($startDate)->diff(date_create('today'))->days%14 == 0;
//true on 2020-05-18, 2020-06-01, ..

最新更新