我正在尝试很多方法,但后来我被卡住了一半。
我们说今天订单已经创建了。我需要显示下一个定期订单何时发生。所以我在2012年6月13日创建了订单。然后我将时间表设置为双月重复订单,每月1日。如何计算下一次重复订单何时发生?答案是8月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>';
我不想简单地找到从现在开始的两个月内的日期。假设订单是在6月1日创建的。下一个重复订单是8月1日。然后现在说,今天是9月1日,但下一个定期订单是10月1日。看到我的困境?
答案 0 :(得分:5)
只需要当月,所以从6月开始,我们得到6. 6 mod 2 == 0
。下个月是7月,我们得到7. 7 mod 2 == 1
。
因此,请检查current month % 2 == (first month % 2)
。
然后检查它是否是该月的第1天。
在PHP中,模数用百分比符号定义。
$month = date('n');
$createdMonth = 6;
if($month % 2 == $createdMonth % 2){
// stuff
}
答案 1 :(得分:4)
您可能会发现名为When的库对此有用(我是作者)。
以下代码将为您提供接下来的2个定期月度日期(从今天开始):
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
更进一步,您可能只想找到2个工作日:
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
另请注意,代码目前正在重写 - 它运行良好,但有点令人困惑,没有很好的文档。
答案 2 :(得分:2)
我明白了:
$today = new DateTime();
$target_date = $today->modify("first day of +2 months");
echo "Your event is on " . $target_date->format("d/m/Y") . "!";
答案 3 :(得分:2)
strtotime
救援:
<?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";
?>
答案 4 :(得分:2)
假设您想要接下来的六个订单:
$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);
}
显然,这可以改进,但它应该让你开始......