2012-08-14 129 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