2012-08-14 128 views
1

我有一個開始日期,讓我們說這是$startDate = 2012-08-01;根據開始日期和價值,我有一個存儲的INT值的變量,可以說這是$value = 10;計算一下日期將使用PHP跳過週末

我會喜歡從startdate + 10天計算日期,並跳過週末。

使用上述值的結果將是2012-08-15

這將如何做呢?

回答

4

這遠沒有效率,但是在可讀性的時候誰會關心這種權利呢? :)

<?php 
function calculateNextDate($startDate, $days) 
{ 
     $dateTime = new DateTime($startDate); 

     while($days) { 
      $dateTime->add(new DateInterval('P1D'));  

      if ($dateTime->format('N') < 6) { 
       $days--; 
      } 
     } 

     return $dateTime->format('Y-m-d'); 
} 

echo calculateNextDate('2012-08-01', 10); // return 2012-08-15 

DEMO

會發生什麼情況應該是很容易理解。首先,我們使用用戶提供的日期創建一個新的DateTime對象。之後,我們將循環瀏覽我們想要添加到日期的日子。當我們在週末打了一天的時候,我們不會從我們想要添加到日期的日子中減去一天。

+0

工作完美,謝謝!還有一個非常感謝的解釋 – David 2012-08-14 08:25:00

+0

+1好的:)。 – pckabeer 2012-08-14 08:55:38

-2

,如果你只是想加起來日期+10,你可能想考慮這個問題:

日期( 「Y-M-d」 的strtotime( 「+ 10天」 的));

+0

問題問如何跳過週末日期。您擁有的代碼只需添加10天。 – Fluffeh 2012-08-14 08:02:47

+0

不跳過週期 – PeeHaa 2012-08-14 08:02:48

0

試試這個

<?php 
function businessdays($begin, $end) { 
    $rbegin = is_string($begin) ? strtotime(strval($begin)) : $begin; 
    $rend = is_string($end) ? strtotime(strval($end)) : $end; 
    if ($rbegin < 0 || $rend < 0) 
     return 0; 

    $begin = workday($rbegin, TRUE); 
    $end = workday($rend, FALSE); 

    if ($end < $begin) { 
     $end = $begin; 
     $begin = $end; 
    } 

    $difftime = $end - $begin; 
    $diffdays = floor($difftime/(24 * 60 * 60)) + 1; 

    if ($diffdays < 7) { 
     $abegin = getdate($rbegin); 
     $aend = getdate($rend); 
     if ($diffdays == 1 && ($astart['wday'] == 0 || $astart['wday'] == 6) && ($aend['wday'] == 0 || $aend['wday'] == 6)) 
      return 0; 
     $abegin = getdate($begin); 
     $aend = getdate($end); 
     $weekends = ($aend['wday'] < $abegin['wday']) ? 1 : 0; 
    } else 
     $weekends = floor($diffdays/7); 
    return $diffdays - ($weekends * 2); 
} 

function workday($date, $begindate = TRUE) { 
    $adate = getdate($date); 
    $day = 24 * 60 * 60; 
    if ($adate['wday'] == 0) // Sunday 
     $date += $begindate ? $day : -($day * 2); 
    return $date; 
} 

$def_date="";//define your date here 
$addDay='5 days';//no of previous days 
date_add($date, date_interval_create_from_date_string($addDay)); 
echo businessdays($date, $def_date); //date prior to another date 
?> 

從修改PHP.net

+0

語法錯誤:http://codepad.viper-7.com/Oe8B3c – PeeHaa 2012-08-14 08:20:21