2017-08-29 26 views
2

任何人都可以幫助創建此邏輯嗎?這種難以解釋的...如何使用變量計算PHP中的日期

想找一個日期,添加3天,然後根據數據庫值選擇下一個日期。

說我們先從:

$end_date = "2017-08-23 23:59:59" 
$payday = 5; //1=monday, 2=tuesday, 3=wednesday, 4=thursday, 5=friday 
//And we want to calculate $paydate: 
$temp_date = $end_date + 3 days; 
$pay_date = the first $payday(day of week) after $temp_date 

任何想法如何在PHP寫的嗎?這一個正在困擾着我。謝謝!

+0

這應該讓你最方式:https://stackoverflow.com/questions/25379449/php-first-monday-after-certain-date-as-string – rtfm

回答

0

這個怎麼樣?這將通過接下來的日子裏得到一個日期,加上3天,然後循環,直到它找到$days陣列中的一天(你可以從數據庫中獲取):

<?php 
$date = new DateTime('2017-08-23 23:59:59'); 
function nextPayday($date) { 
    $date->add(new DateInterval('P3D')); 
    echo "Date + 3 days: ".$date->format('D Y-m-d') . "<br>"; 
    $payDate = $date->add(new DateInterval('P1D')); 
    $days = ["1", "2", "3", "4", "5"]; 
    while (!in_array($payDate->format("N"), $days)) { 
     $payDate->add(new DateInterval('P1D')); 
    } 
    return $payDate->format("D Y-m-d"); 
} 
echo "Date + 3 days: ".$date->format('D Y-m-d') . "<br>"; 
echo "Next payday: ".nextPayday($date); 

Demo

或者,如果你需要找到下一個特定天,使用此功能來代替:

function nextPayday($date) { 
    $date->add(new DateInterval('P3D')); 
    echo "Date + 3 days: ".$date->format('D Y-m-d') . "<br>"; 
    $payDate = $date->add(new DateInterval('P1D')); 
    $day = "5"; 
    while ($payDate->format("N") !== $day) { 
     $payDate->add(new DateInterval('P1D')); 
    } 
    return $payDate->format("D Y-m-d"); 
} 
+0

輝煌,謝謝。這正是我需要的(第二部分)。 –

1

添加三個日子裏,你可以這樣做:

$date = new DateTime('2017-08-23 23:59:59'); 
$date->add(new DateInterval('P3D')); 
$date->modify("next friday"); 
echo $date->format('Y-m-d') . "\n"; 

你也可以使用一個查找表,或陣列,匹配數週的名爲天,使用類似$date->modify("next $days[$payday]"); 其中

$days = [ [1] => "monday", 
      .... etc 
+0

謝謝。添加3天后,我正在嘗試獲取該日期,並找到與「pay_day」設置相對應的下一個日曆日。 –

+0

例如,$ pay_day = 5; // 1 = mon ... 5 =星期五 –

+0

因此,我試圖在新日期(添加3天后)和發現該日期的第一個星期五或更新 –

0

Jeff,看看擴展PHP的DateTime對象的Carbon

它允許您以非常乾淨和直觀的方式處理日期。根據你的例子:

$date = Carbon::parse('next monday')->toDateString(); 

調整你的確切情況。

0

另一個版本來達到目的:

function nextPayday($dateString, $paydayNum) { 
    $paydays = [ 
      1=>'monday', 
      2=>'tuesday', 
      3=>'wednesday', 
      4=>'thursday', 
      5=>'friday' 
    ]; 
    $temp_date_stamp = date('d-m-Y H:i:s', strtotime($dateString.' +3 days')); 
    $pay_date_stamp = strtotime('first '.$paydays[$paydayNum].' '.$temp_date_stamp); 

    return date('d-m-Y H:i:s', $pay_date_stamp); 
} 

$end_date = "2017-08-23 23:59:59"; 
$payday = 5; 

echo nextPayday($end_date, $payday); 

結果:

01-09-2017 23:59:59