如何在php中找到另一个日期之前的日期

时间:2012-08-09 06:49:20

标签: php

我需要找到date x,使其n working days之前为date y

我可以使用类似date("Y-m-d",$def_date." -5 days");的东西,但在这种情况下,它不会考虑周末或更新。我们假设我的工作日是星期一到星期六,我知道如何才能做到这一点?

3 个答案:

答案 0 :(得分:1)

试试这个

<?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
$preDay='5 days';//no of previous days  
date_sub($date, date_interval_create_from_date_string($preDay));
echo businessdays($date, $def_date); //date prior to another date 
?>

PHP.net修改

答案 1 :(得分:0)

感谢帮助人员,但为了解决这个特殊问题,我写了一个简单的代码:

    $sh_padding = 5; //No of working days to count backwards 
    $temp_sh_padding = 1; //A temporary holder
    $end_stamp = strtotime(date("Y-m-d", strtotime($date_format)) . " -1 day"); //The date(timestamp) from which to count backwards
    $start_stamp = $end_stamp; //start from same as end day
    while($temp_sh_padding<$sh_padding)
    {
        $sh_day = date('w',$start_stamp);
        if($sh_day==0){ //Skip if sunday
        }
        else
        {
            $temp_sh_padding++;
        }
        $start_stamp = strtotime(date("Y-m-d",$start_stamp)." -1 day");
    }
    $sh_st_dte = date("Y-m-d",$start_stamp); //The required start day

答案 2 :(得分:0)

谷歌搜索的一小部分让我进入this page,其中包括计算两个日期之间工作日数的功能。

根据您的需要调整这个概念应该是相当简单的。

然而,你的问题是,星期一至星期五的“工作日”概念并不普遍。如果您的软件只是在内部使用,那么可以做出一些假设,但如果它打算供第三方使用,那么您不能认为它们将和您一样拥有相同的工作周。

此外,公众假期将通过从全年各个工作周内删除任意日期来投入大量工作。

如果您想要满足这些要求,那么唯一明智的做法是将年份的日期存储在日历中(即大型数组),并将它们分别标记为工作日或非工作日。如果你打算这样做,那么你也可以在周末使用相同的机制。

当然,不利的是,这需要保持最新状态。但至少在周末,这将是微不足道的(提前循环日历并标记周末date('w')==0 or date('w')==6)。