PHP。如何获得双月定期活动?

PHP。如何获得双月定期活动?,php,Php,我尝试了很多方法,但后来我半途而废了 假设订单是今天创建的。我需要显示下一个定期订单何时发生。因此,我已于2012年6月13日创建了订单。然后,我将时间表设置为每月1日,每两个月重复一次。如何计算下一个定期订单何时发生?答案是八月一日 如果有人能概括出一种方法,那将非常有用,它不一定是代码。这就是我目前所拥有的 // first, get starting date $start_date_month = date('m', strtotime($start_date));

我尝试了很多方法,但后来我半途而废了

假设订单是今天创建的。我需要显示下一个定期订单何时发生。因此,我已于2012年6月13日创建了订单。然后,我将时间表设置为每月1日,每两个月重复一次。如何计算下一个定期订单何时发生?答案是八月一日

如果有人能概括出一种方法,那将非常有用,它不一定是代码。这就是我目前所拥有的

    // first, get starting date
    $start_date_month = date('m', strtotime($start_date));

    // get this year
    $this_year = date('Y');

    // if this month is december, next month is january
    $this_month = date('m', $timestamp_month);
    if($this_month == 12){
      $next_month = 1;
    // if this month is not december add 1 to get next month
    }else{
      $next_month = $this_month + 1;
    }

    // get array of months where recurring orders will happen
    $months = array();
    for ($i=1; $i<=6; $i++) {
      $add_month = $start_date_month+(2*$i); // 2, 4, 6, 8, 10, 12
      if($add_month == 13){$add_month = 1;$year = $this_year+1;}
      elseif($add_month == 14){$add_month = 2;$year = $this_year+1;}
      elseif($add_month == 15){$add_month = 3;$year = $this_year+1;}
      elseif($add_month == 16){$add_month = 4;$year = $this_year+1;}
      elseif($add_month == 17){$add_month = 5;$year = $this_year+1;}
      elseif($add_month == 18){$add_month = 6;$year = $this_year+1;}
      elseif($add_month == 19){$add_month = 7;$year = $this_year+1;}
      elseif($add_month == 20){$add_month = 8;$year = $this_year+1;}
      else{$year = $this_year;}
      echo $what_day.'-'.$add_month.'-'.$year.'<br />';
      $months[] = $add_month;
    }

    echo '<pre>';
    print_r($months);
    echo '</pre>';
//首先,获取开始日期
$start_date_month=日期('m',strottime($start_date));
//今年得到
$this_year=日期('Y');
//如果这个月是十二月,下个月就是一月
$this_month=日期('m',$timestamp_month);
如果($this_month==12){
$next_month=1;
//如果本月不是12月,则添加1以获取下个月
}否则{
$next_month=$this_month+1;
}
//获取将发生定期订单的月份数组
$months=array();

对于($i=1;$i只取当前月份,因为是6月,我们得到6。
6 mod 2==0
。下个月是7月,我们得到7。
7 mod 2==1

所以只需检查
当前月份%2==(第一个月%2)

然后看看是不是本月的第一天

在PHP中,模数是用百分比符号定义的

$today = new DateTime();
$target_date = $today->modify("first day of +2 months");

echo "Your event is on " . $target_date->format("d/m/Y") . "!";
我明白了:

<?php
date_default_timezone_set('Europe/London');
$d = new DateTime('2012-01-31');
$d->modify('first day of +2 months');
echo $d->format('r'), "\n";
?>

strotime
救援:

$order_date = '6/13/2012';
$start      = date('Y-m-01', strtotime($order_date));

$order_count = 6;

$future_orders = array();

$next = strtotime('+2 months', strtotime($start));
while(count($future_orders) < $order_count){
    $future_orders[] = date('m/d/Y',$next);
    $next = strtotime('+2 months', $next);
}

假设您想要接下来的六份订单:

include 'When.php';

$r = new When();
$r->recur(new DateTime(), 'monthly')
  ->count(2)
  ->interval(2) // every other month
  ->bymonthday(array(1));

while($result = $r->next())
{
    echo $result->format('c') . '<br />';
}

// output
// 2012-08-01T13:33:33-04:00
// 2012-10-01T13:33:33-04:00
$order_date='6/13/2012';
$start=日期('Y-m-01',STROTTIME($order_date));
$order_count=6;
$future_orders=array();
$next=STROTIME('+2个月',STROTIME($start));
while(计数($future\u orders)<$order\u计数){
$future_orders[]=日期('m/d/Y',$next);
$next=STROTIME(“+2个月,$next”);
}

显然,这是可以改进的,但它应该让您开始…

您可能会发现名为“有用”的库(我是作者)

以下代码将为您提供下两个定期每月日期(从今天开始):

包括'When.php';
$r=新时();
$r->recur(新日期时间(),“每月”)
->计数(2)
->间隔(2)//每隔一个月
->bymonthday(数组(1));
而($result=$r->next())
{
echo$result->format('c')。
; } //输出 //2012-08-01T13:33:33-04:00 //2012-10-01T13:33:33-04:00
更进一步,您可能只想找到前两个工作日:

包括'When.php';
$r=新时();
$r->recur(新日期时间(),“每月”)
->计数(2)
->间隔(2)//每隔一个月
->byday(数组('MO','TU','WE','TH','FR')//仅周天数
->bymonthday(数组(1,2,3))//第一个工作日将落在其中一天
->bysetpos(数组(1));//每月只返回一个
而($result=$r->next())
{
echo$result->format('c')。
; } //输出 //2012-08-01T13:33:33-04:00 //2012-10-01T13:33:33-04:00

还要注意的是,该代码目前正在重写中——它工作得很好,但有点混乱,没有很好的文档记录。

它是双月刊,每两个月一次。确切地说,这种方法会起作用。如果你在6月(6日)开始,它会跳过7月,然后8月(8日)会再次发生该事件。(6%2)=(8%2)如果你在7月(7日)开始它,它将在9月再次出现,因为
9%2
7%2
是相等的,但它将跳过8月,因为
8%2
不等于
7%2
好吧,假设现在3个月过去了,我们是在9月5日。下一次重复订单应该在10月发生。你是怎么做到的?这不仅仅是一次或多次der,是一个周期性订单,应该每两个月发生一次。它将在10月发生,因为10月是偶数月,
10%2
等于
6%2
您只想要从今天开始的下一个周期性日期,还是从创建到包括从今天开始的下一个周期性日期的所有周期性日期?我看不到您的dilemma。为什么9月1日很重要?它与定期订单问题有什么关系?因为如果今天创建了订单,6月13日很容易生成下一个定期订单。也很容易生成一个包含所有后续6个定期订单的数组。现在,如果今天是9月1日,你如何计算下一个定期订单?所有这些需要计算的是一个日期,只是下一个定期订单。
include 'When.php';

$r = new When();
$r->recur(new DateTime(), 'monthly')
  ->count(2)
  ->interval(2) // every other month
  ->bymonthday(array(1));

while($result = $r->next())
{
    echo $result->format('c') . '<br />';
}

// output
// 2012-08-01T13:33:33-04:00
// 2012-10-01T13:33:33-04:00
include 'When.php';

$r = new When();
$r->recur(new DateTime(), 'monthly')
  ->count(2)
  ->interval(2)                                 // every other month
  ->byday(array('MO', 'TU', 'WE', 'TH', 'FR'))  // week days only
  ->bymonthday(array(1, 2, 3))                  // the first weekday will fall on one of these days
  ->bysetpos(array(1));                         // only return one per month

while($result = $r->next())
{
    echo $result->format('c') . '<br />';
}

// output
// 2012-08-01T13:33:33-04:00
// 2012-10-01T13:33:33-04:00