Php:我怎样才能得到接下来几个月的相同日期,每季度和每半年一次

Php:我怎样才能得到接下来几个月的相同日期,每季度和每半年一次,php,laravel,datetime,php-carbon,Php,Laravel,Datetime,Php Carbon,在这种情况下,用户可以选择每月、每季度或每半年在计费周期中选择的某个特定日期进行计费。我正在使用Laravel PHP框架 例如,每月-2016年5月5日、2016年6月5日、2016年7月5日等。 每月5日计费 例如,季度-2016年1月10日、2016年3月10日、2016年6月10日等。。。 每三个月后10日付款 例如,每半年-2016年4月13日、2016年9月13日 每六个月后于13日付款 这里的目标是在用户选择计费的每个月获得相同的日期,但是是在一个月、一个季度或半年内 这是我玩@r

在这种情况下,用户可以选择每月、每季度或每半年在计费周期中选择的某个特定日期进行计费。我正在使用Laravel PHP框架

例如,每月-2016年5月5日、2016年6月5日、2016年7月5日等。 每月5日计费 例如,季度-2016年1月10日、2016年3月10日、2016年6月10日等。。。 每三个月后10日付款 例如,每半年-2016年4月13日、2016年9月13日 每六个月后于13日付款

这里的目标是在用户选择计费的每个月获得相同的日期,但是是在一个月、一个季度或半年内

这是我玩@rishimethode一段时间后的代码

public function as_you_go($pay_as_you_go,$grand_total,$payment_date,$policy_id)
{
    $policy = $this->findorFail($policy_id);
    if($pay_as_you_go == 'Semi-Annually'){
        $payments_no = 2;
        $installment_amount = $grand_total/$payments_no;
        $month_gap = 6;
        $add_month = '+6 month';
    }elseif($pay_as_you_go == 'Quarterly'){
        $payments_no = 4;
        $installment_amount = $grand_total/$payments_no;
        $month_gap = 3;
        $add_month = '+3 month';
    }elseif($pay_as_you_go == 'Monthly'){
        $payments_no = 12;
        $installment_amount = $grand_total/$payments_no;
        $month_gap = 1;
        $add_month = '+1 month';
    }

    // Pay as you go calculations
    for ($x = 0; $x < $payments_no; $x++) {
        //$add_month = '+'.$x.' month';
        $installment = new \App\Installment;
        $installment->amount = $installment_amount;


        if(\App\Installment::wherePayableType('App\Policy')->wherePayableId($policy->id)->first()){

            $payment = \App\Installment::wherePayableType('App\Policy')->wherePayableId($policy->id)->orderBy('id', 'desc')->first();
            $date = $payment->payment_date->format('Y-m-d');
            $installment->payment_date = date('Y-m-d',strtotime($date.$add_month));
        }else{
            $installment->payment_date = $payment_date;
        }
        $installment->is_payed = 'No';
        $policy->installments()->save($installment);
    }

}
public function as_you_go($pay_as_you_go,$grand_total,$payment_date,$policy_id)
{
$policy=$this->findorFail($policy\u id);
如果($pay_as_you_go=='半年一次'){
$payments_no=2;
$分期付款金额=$grand\总额/$payments\编号;
$month_差距=6;
$add_month='+6个月';
}elseif($pay\u as\u you\u go==‘季度’){
$payments_no=4;
$分期付款金额=$grand\总额/$payments\编号;
$month_差距=3;
$add_month='+3个月';
}elseif($pay\u as\u you\u go==‘每月’){
$payments_no=12;
$分期付款金额=$grand\总额/$payments\编号;
$month_差距=1;
$add_month='+1个月';
}
//现收现付计算
对于($x=0;$x<$payments\u no;$x++){
//$add_month='+.$x.'month';
$分期付款=新建\应用\分期付款;
$分期付款->金额=$分期付款\金额;
如果(\App\instance::wherePayableType('App\Policy')->wherePayableId($Policy->id)->first()){
$payment=\App\分期付款::wherePayableType('App\Policy')->wherePayableId($Policy->id)->orderBy('id','desc')->first();
$date=$payment->payment_date->format('Y-m-d');
$分期付款->付款日期=日期('Y-m-d',标准时间($date.$add\u month));
}否则{
$分期付款->付款日期=$付款日期;
}
$分期付款->已付款='否';
$policy->分期付款()->保存($分期付款);
}
}
这是我的函数,我想根据用户选择的日期,根据半年、季度和每月的付款差额生成日期。

试试这样

<?php
  $date = '1-may-2016';
  echo date('d-F-Y',strtotime($date.'+1 month'))."\n";
  echo date('d-F-Y',strtotime($date.'+3 month'))."\n";
  echo date('d-F-Y',strtotime($date.'+6 month'))."\n";
?>

检查此处的输出:

此外,您还需要考虑像
$date='2016年1月30日'这样的日期

像这样试试

<?php
  $date = '1-may-2016';
  echo date('d-F-Y',strtotime($date.'+1 month'))."\n";
  echo date('d-F-Y',strtotime($date.'+3 month'))."\n";
  echo date('d-F-Y',strtotime($date.'+6 month'))."\n";
?>

检查此处的输出:


此外,您还需要考虑像
$date='2016年1月30日'这样的日期

我不完全确定您要找的是什么,但我认为以下内容将对您有所帮助

您可以使用
DateTime
DateInterval
操纵日期,以增加月数

// We have a DateTime object which is on the 5th may
$date = new DateTime('2016-05-05');

$billingType = 'monthly';

switch ($billingType) {
    case 'monthly':
        $interval = new DateInterval('P1M');
        break;

    case 'quarterly':
        $interval = new DateInterval('P3M');
        break;

    case 'biannually':
        $interval = new DateInterval('P6M');
        break;
}

$newDate = clone $date;
$newDate->add($interval);

echo $date->format('Y-m-d'); // 2016-05-05
echo $newDate->format('Y-m-d'); // 2016-06-05
假设你想看看今天是否是给某人开账单的日子

function isBillingDate(DateTime $date, DateTime $billingDate, $billingType)
{
    switch ($billingType) {
        case 'monthly':
            $interval = new DateInterval('P1M');
            break;

        case 'quarterly':
            $interval = new DateInterval('P3M');
            break;

        case 'biannually':
            $interval = new DateInterval('P6M');
            break;
    }

    $isBillingDate = false;

    $date->setTime(00, 00, 00);
    $billingDate->setTime(00, 00, 00);

    do {
        if ($date == $billingDate) {
            $isBillingDate = true;
        } else {
            $billingDate->add($interval);
        }
    } while ($isBillingDate === false && $date <= $billingDate);

    return $isBillingDate;
}

$date = new DateTime('now'); // We want to check if we should bill them today (3rd June)

$billingStartDate = new DateTime('2016-05-03'); // They signed up to get billed on the 3rd of May
$billingType = 'monthly'; // They want to get billed every month
var_dump(isBillingDate($date, $billingStartDate, $billingType)); // True

$billingStartDate = new DateTime('2016-03-03'); // They signed up to get billed on the 3rd of March
$billingType = 'quarterly'; // They want to get billed quarterly
var_dump(isBillingDate($date, $billingStartDate, $billingType)); // True

$billingStartDate = new DateTime('2016-04-03'); // They signed up to get billed on the 3rd of April
$billingType = 'quarterly'; // They want to get billed quarterly
var_dump(isBillingDate($date, $billingStartDate, $billingType)); // False
函数isBillingDate(DateTime$date,DateTime$billingDate,$billingType)
{
开关($billingType){
个案"每月":
$interval=新的日期间隔('P1M');
打破
“季度”案例:
$interval=新的日期间隔(“P3M”);
打破
“每半年”一次的案例:
$interval=新的日期间隔('P6M');
打破
}
$isBillingDate=false;
$date->setTime(00,00,00);
$billingDate->setTime(00,00,00);
做{
如果($date==$billingDate){
$isBillingDate=true;
}否则{
$billingDate->add($interval);
}

}虽然($isBillingDate===false&&$date我不完全确定您在寻找什么,但我认为以下内容将在您的道路上帮助您

您可以使用
DateTime
DateInterval
操纵日期,以增加月数

// We have a DateTime object which is on the 5th may
$date = new DateTime('2016-05-05');

$billingType = 'monthly';

switch ($billingType) {
    case 'monthly':
        $interval = new DateInterval('P1M');
        break;

    case 'quarterly':
        $interval = new DateInterval('P3M');
        break;

    case 'biannually':
        $interval = new DateInterval('P6M');
        break;
}

$newDate = clone $date;
$newDate->add($interval);

echo $date->format('Y-m-d'); // 2016-05-05
echo $newDate->format('Y-m-d'); // 2016-06-05
假设你想看看今天是否是给某人开账单的日子

function isBillingDate(DateTime $date, DateTime $billingDate, $billingType)
{
    switch ($billingType) {
        case 'monthly':
            $interval = new DateInterval('P1M');
            break;

        case 'quarterly':
            $interval = new DateInterval('P3M');
            break;

        case 'biannually':
            $interval = new DateInterval('P6M');
            break;
    }

    $isBillingDate = false;

    $date->setTime(00, 00, 00);
    $billingDate->setTime(00, 00, 00);

    do {
        if ($date == $billingDate) {
            $isBillingDate = true;
        } else {
            $billingDate->add($interval);
        }
    } while ($isBillingDate === false && $date <= $billingDate);

    return $isBillingDate;
}

$date = new DateTime('now'); // We want to check if we should bill them today (3rd June)

$billingStartDate = new DateTime('2016-05-03'); // They signed up to get billed on the 3rd of May
$billingType = 'monthly'; // They want to get billed every month
var_dump(isBillingDate($date, $billingStartDate, $billingType)); // True

$billingStartDate = new DateTime('2016-03-03'); // They signed up to get billed on the 3rd of March
$billingType = 'quarterly'; // They want to get billed quarterly
var_dump(isBillingDate($date, $billingStartDate, $billingType)); // True

$billingStartDate = new DateTime('2016-04-03'); // They signed up to get billed on the 3rd of April
$billingType = 'quarterly'; // They want to get billed quarterly
var_dump(isBillingDate($date, $billingStartDate, $billingType)); // False
函数isBillingDate(DateTime$date,DateTime$billingDate,$billingType)
{
开关($billingType){
个案"每月":
$interval=新的日期间隔('P1M');
打破
“季度”案例:
$interval=新的日期间隔(“P3M”);
打破
“每半年”一次的案例:
$interval=新的日期间隔('P6M');
打破
}
$isBillingDate=false;
$date->setTime(00,00,00);
$billingDate->setTime(00,00,00);
做{
如果($date==$billingDate){
$isBillingDate=true;
}否则{
$billingDate->add($interval);
}

}而($isBillingDate===false&&$date基于Rishi的代码,我做了这个。
它将日期拆分为两部分,一部分用于月计算,另一部分用于日计算

编辑:注意到代码中有一个非常明显的错误

<?php
$date = '2016-01-26';
$date2= substr($date,0,7)."-01";
$period = "+3 month";

If(substr($date,-2) >  date('t',strtotime($date2.$period))){

    echo date('t-F-Y',strtotime($date2.$period))."\n";

}else{

    echo date("d-", strtotime($date)) . date('F-Y',strtotime($date2.$period))."\n";

}
?>

根据Rishi的代码,我做了这个。
它将日期拆分为两部分,一部分用于月计算,另一部分用于日计算

编辑:注意到代码中有一个非常明显的错误

<?php
$date = '2016-01-26';
$date2= substr($date,0,7)."-01";
$period = "+3 month";

If(substr($date,-2) >  date('t',strtotime($date2.$period))){

    echo date('t-F-Y',strtotime($date2.$period))."\n";

}else{

    echo date("d-", strtotime($date)) . date('F-Y',strtotime($date2.$period))."\n";

}
?>
月底 季度(四个季度) 月底 季度(四个季度)
已经说过他需要考虑这一点,它不会给出相同的日期。如果我们说下个月的相同日期,这是口头上的错误。对不起,没有这样读那句话。是的,下个月可能会说相同的日期。一个试过的Rishi方法,经过一些更新,效果很好。谢谢大家的支持。@MichaelReuben I think你应该发布代码。这是SO的一部分。答案是最重要的。其他人可能会在以后找到此线程并想要代码。我在玩@Rishi方法后添加了我的工作代码。已经说过他需要考虑这一点,它不会给出相同的日期。如果我们说下个月的相同日期是口头错误的
不是吗?对不起,没有用那种方式读那个句子。是的,下个月它可能会说同样的日期。A试过你的方法吗
$date = new \DateTime('2016-07-14');
iterateMonths($date, 3, 4);

// 2016-10-14, 2017-01-14, 2017-04-14, 2017-07-14