2016-09-20 37 views
1
$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 />"; 
} 

輸出爲:產生相同的日期作爲結帳日期PHP

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 

現在,我要的是如果合同起始日期是不是在第一次的任何一個月的開始,那麼我來計算同月的剩餘,並得到其他的結果一樣:

輸出我在尋找:

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 

所以第一DAT e(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

我建議在foreach裏動態地計算$ no_of_days。這段代碼太複雜了,無法提供示例。我建議你在功能上分開它,它肯定會幫助你找到解決方案。 –

+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)); 
} 
+0

謝謝,輸出是真棒,但我沒有得到合同價值的前15天,而是它顯示了一個月。請檢查並幫助 –

+0

@RamansathiyaNarayanan我已更新代碼 –

+0

它再次採取第一個月的價值,檢查我的問題,我已經更新了您的代碼的答案。 –

相關問題