用PHP在给定月份抓住所有星期三

Yar*_*rin 12 php datetime

这是我正在尝试写的功能:

function getWednesdays($month, $year) {
   // Returns an array of DateTimes representing all Wednesdays this month.
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢-

Gor*_*don 29

使用PHP5.3

function getWednesdays($y, $m)
{
    return new DatePeriod(
        new DateTime("first wednesday of $y-$m"),
        DateInterval::createFromDateString('next wednesday'),
        new DateTime("last day of $y-$m")
    );
}
Run Code Online (Sandbox Code Playgroud)

用法:

foreach (getWednesdays(2010, 11) as $wednesday) {
    echo $wednesday->format("l, Y-m-d\n");
}
Run Code Online (Sandbox Code Playgroud)

输出:

Wednesday, 2010-11-03
Wednesday, 2010-11-10
Wednesday, 2010-11-17
Wednesday, 2010-11-24
Run Code Online (Sandbox Code Playgroud)

请注意,这将排除结束日期,因此如果$y-$m恰好是星期三的最后一天,它将不在列表中.您必须在结束日期添加一天,以包含它.要包含它,请将结束日期中的相对格式更改为

new DateTime("next month $y-$m-01")
Run Code Online (Sandbox Code Playgroud)

然后将结束日期设置为下个月的第一天,


PHP <5.3

function getWednesdays($y, $m)
{
    $ts  = strtotime("first wednesday $y-$m-01");
    $end = strtotime("last wednesday $y-$m");
    $wednesdays = array();
    while($ts <= $end) {
        $wednesdays[] = $ts;
        $ts = strtotime('next wednesday', $ts);
    }
    return $wednesdays;
}
Run Code Online (Sandbox Code Playgroud)

用法:

foreach (getWednesdays(2010, 11) as $wednesday) {
    echo date("l, Y-m-d\n", $wednesday);
}
Run Code Online (Sandbox Code Playgroud)

与上面相同的输出(在键盘上运行).

请注意,由于相对格式解析器的更改,这对5.3之前的任何版本都不起作用.如果你想在PHP 5.3+中使用它,你必须first Wednesday $y-$m-01改为first Wednesday of $y-$m-01(记住"of").此外,就像在DateTime版本中一样,不包括结束日期.


进一步阅读:

  • @ 15121991介意段落陈述*"请注意,这将排除结束日期,因此如果$ y- $ m的最后一天恰好是星期三,它将不在列表中.您必须添加一天结束日期,包括它.要包括它,将结束日期的相对格式更改为"新DateTime("下个月$ y- $ m-01")"* (2认同)