$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)."     ".$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
总价值低于合约价值。
答案 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)."     ".$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));
}