Php 如何查找一个月的最后一个星期一

Php 如何查找一个月的最后一个星期一,php,Php,我不知道该怎么办。我正在用PHP构建日历,需要用户能够添加符合以下规则的重复事件: 本月最后一个[道指](本周最后一个[周一/周二/周三/等]) 我已经存储了规则本身,我只是不确定如何最好地用PHP推断每月的最后一个周一/周二/周三?我觉得我把事情弄得比实际需要的更复杂了 假设你有$month=4,$dow=3和$year=2011变量,我最好怎么做?对于所有与日期相关的,你可以用正统英语表达,但很难用数字表达的,你是最好的朋友 echo strtotime("last Monday of Ju

我不知道该怎么办。我正在用PHP构建日历,需要用户能够添加符合以下规则的重复事件:

本月最后一个[道指](本周最后一个[周一/周二/周三/等])

我已经存储了规则本身,我只是不确定如何最好地用PHP推断每月的最后一个周一/周二/周三?我觉得我把事情弄得比实际需要的更复杂了


假设你有
$month=4
$dow=3
$year=2011
变量,我最好怎么做?

对于所有与日期相关的,你可以用正统英语表达,但很难用数字表达的,你是最好的朋友

echo strtotime("last Monday of June 2011");
这将返回一个时间戳,您可以将其用作第二个参数,并希望获得一个正确的、人类可读的日期。因为它是用C编写的内置函数,所以这个解决方案也比用PHP编写的任何其他解决方案都要快得多(尽管我很确定这在现实场景中不会有多大影响)


因此,假设您有
$month=4
$dow=3
$year=2011
,您需要一个数组将
$month
值映射到它们的英文文本表示形式,另一个数组将
$dow
值映射到它们的文本表示形式。

我有一个通用函数供您计算一个月的第n天。希望这能帮助您解决您的问题

function get_Nth_dow($dow, $occurence, $m, $y)
{
    $numdays = date('t', mktime(0, 0, 0, $m, 1, $y));
    $add = 7 * ($occurence - 1);
    $firstdow = date('w', mktime(0, 0, 0, $m, 1, $y));
    $diff = $firstdow - $dow;

    $day_of_month = 1;
    if ($diff > 0)
    {
        $day_of_month += ($add - $diff);
    }
    elseif ($diff < $numdays)
    {
        $day_of_month -= ($diff - $add);
    }

    return $day_of_month;
}
函数get\n\u dow($dow,$occurrence,$m,$y) { $numdays=日期('t',mktime(0,0,0,m,1,y)); $add=7*($occurrence-1); $firstdow=日期('w',mktime(0,0,0,m,1,y)); $diff=$firstdow-$dow; $day\u/u月=1; 如果($diff>0) { $day\u of_month+=($add-$diff); } elseif($diff<$numdays) { $day\u of_month-=($diff-$add); } 返回每月的$day\u; }
$DOW
=一周中的某一天(0=周日,6=周六)

$X
=发生(1=第一个,2=第三个,等等)。如果给定的月份

没有发生,则返回最后一个。例如,如果

如果您请求星期五的第7个事件,它将返回最后一个事件

本月的星期五。
$M
=月
$Y
=年

例如,
获得道指(2,3,72009)
将返回2009年7月7日的第三个星期二。

这里有一个替代方案:

<?
function lastDayOfMonth($month, $year) {
    switch ($month) {
        case 2:
            # if year is divisible by 4 and not divisible by 100
            if (($year % 4 == 0) && ($year % 100) > 0)
                return 29;
            # or if year is divisible by 400
            if ($year % 400 == 0)
                return 29;
            return 28;
        case 4:
        case 6:
        case 9:
        case 11:
            return 30; 
        default:
            return 31;
    }
}

function lastDayOfWeek($month, $year, $dow) {
    $d = new DateTime();

    #Finding the last day of month
    $d = $d->setDate($year, $month, lastDayOfMonth($month, $year));

    #Getting the day of week of last day of month
    $date_parts = getdate($d->getTimestamp());

    $diff = 0;

    #if we can't find the $dow in this week... (cause it would lie on next month)
    if ($dow > $date_parts['wday']) {
        # ...we go back a week.
        $diff -= 7;
    }

    return $date_parts['mday'] + $diff + ($dow - $date_parts['wday']);  
}

# checking the algorithm for this month...
for ($i=0; $i < 7; $i++) {
    echo lastDayOfWeek(6,2011,$i) . "<br>";
}

?>

请注意:确保不要忘记