生成与账单日期相同的日期php

时间:2016-09-20 11:28:23

标签: php

$contract_start_date = strtotime('2016-01-01');
$contract_end_date = strtotime('2016-12-01');

$contract_start_date_last_date = date('t', $contract_start_date);
echo "contract last date of any start month: ".$contract_start_date_last_date."<br />";
$contract_end_date_last_date = date('t', $contract_end_date);
echo "contract last date of any end month: ".$contract_end_date_last_date."<br />";


$no_of_months = 1 + (date("Y", $contract_end_date) - date("Y", $contract_start_date)) * 12;
$no_of_months += date("m", $contract_end_date) - date("m", $contract_start_date);
$no_of_days =  $contract_start_date_last_date - date("d", $contract_start_date);
echo $no_of_days."<br />";
echo $no_of_months."<br />";



$total_contract_value = 1000;
$no_of_bookings = 1;
$no_of_records = ($no_of_months / $no_of_bookings);
echo $no_of_records."<br />";
$contract_value = ($total_contract_value / $no_of_records);
echo $contract_value."<br />";
$initial_contract_value_for_first_month = ($contract_value / $no_of_days);
echo $initial_contract_value_for_first_month."<br />";

for($i = 0; $i < $no_of_records; $i++){
    $proceed = false;
    $calculated_records = intval($i * $no_of_bookings);
    echo $calculated_records."<br />";
    $contract_date = strtotime("+".$calculated_records." months", $contract_start_date);
    echo date('Y-m-d', $contract_date)."&nbsp&nbsp&nbsp&nbsp&nbsp".$contract_value."<br />";
}

输出是:

2016-01-01     83.333333333333
2016-02-01     83.333333333333
2016-03-01     83.333333333333
2016-04-01     83.333333333333
2016-05-01     83.333333333333
2016-06-01     83.333333333333
2016-07-01     83.333333333333
2016-08-01     83.333333333333
2016-09-01     83.333333333333
2016-10-01     83.333333333333
2016-11-01     83.333333333333
2016-12-01     83.333333333333

现在,我想要的是如果合约开始日期没有在任何一个月的第一天开始,那么我必须计算同月的剩余时间并得到与其他结果相同的结果:

输出I&#39; m寻找:

    2016-01-15     83.333333333333
    2016-02-01     83.333333333333
    2016-03-01     83.333333333333
    2016-04-01     83.333333333333
    2016-05-01     83.333333333333
    2016-06-01     83.333333333333
    2016-07-01     83.333333333333
    2016-08-01     83.333333333333
    2016-09-01     83.333333333333
    2016-10-01     83.333333333333
    2016-11-01     83.333333333333
    2016-12-01     83.333333333333

因此,第一个日期(2016-01-15)应计算同月15日至最后日期之间的日期,其他日期应如上所示。请有人提出建议,我已经找到了通过执行以下代码插入前15天值的方法:

$one_month_contract_value = ($contract_value / $contract_start_date_last_date);
echo $one_month_contract_value."<br />";
$initial_contract_value_for_first_month = ($one_month_contract_value*$no_of_days);
echo $initial_contract_value_for_first_month."<br />";

这给了我第一个月的合约价值,我可以直接将其插入数据库。现在我该如何继续计算第一次约会的其他月份。

这是我现在得到的输出:

2016-01-15     43.010752688172
2016-01-01     83.333333333333
2016-02-01     83.333333333333
2016-03-01     83.333333333333
2016-04-01     83.333333333333
2016-05-01     83.333333333333
2016-06-01     83.333333333333
2016-07-01     83.333333333333
2016-08-01     83.333333333333
2016-09-01     83.333333333333
2016-10-01     83.333333333333
2016-11-01     83.333333333333

总价值低于合约价值。

1 个答案:

答案 0 :(得分:1)

这就是我的看法。我希望这个想法可以帮到你

$contract_start_date = strtotime('2016-01-15');
$contract_end_date = strtotime('2016-12-01');

$contract_start_date_last_date = date('t', $contract_start_date);
echo "contract last date of any start month: ".$contract_start_date_last_date."<br />";
$contract_end_date_last_date = date('t', $contract_end_date);
echo "contract last date of any end month: ".$contract_end_date_last_date."<br />";

$no_of_months = 1 + (date("Y", $contract_end_date) - date("Y", $contract_start_date)) * 12;
$no_of_months += date("m", $contract_end_date) - date("m", $contract_start_date);
echo $no_of_months."<br />";

$total_contract_value = 1000;
$no_of_bookings = 1;
$no_of_records = ($no_of_months / $no_of_bookings);
echo $no_of_records."<br />";

$current_month = $contract_start_date;
for($i = 0; $i < $no_of_records; $i++){
    $contract_start_date_last_date = date('t', $current_month);
    $no_of_days =  $contract_start_date_last_date - date("d", $current_month);

    $contract_value = ($total_contract_value / $no_of_records);
    if ($i === 0) {
        $one_month_contract_value = $contract_value / $contract_start_date_last_date;       
        $contract_value = $one_month_contract_value * $no_of_days;
    }

    echo date('Y-m-d', $current_month)."&nbsp&nbsp&nbsp&nbsp&nbsp".$contract_value."<br />";

    $calculated_records = intval($i * $no_of_bookings);
    $current_month = strtotime("+".$calculated_records." months", getStartDateOfMonth($contract_start_date));
}

function getStartDateOfMonth($timestamp) {
    return strtotime(date('Y-m-01', $timestamp));
}