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

时间:2010-11-27 18:22:58

标签: php datetime

这是我要写的功能:

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

有什么想法吗?谢谢 -

11 个答案:

答案 0 :(得分:27)

使用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")
    );
}

用法:

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

输出:

Wednesday, 2010-11-03
Wednesday, 2010-11-10
Wednesday, 2010-11-17
Wednesday, 2010-11-24

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

new DateTime("next month $y-$m-01")

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


使用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;
}

用法:

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

与上面相同的输出(Run on Codepad)。

请注意,由于相对格式解析器的更改,此does not work for any version prior to 5.3。如果你想在PHP 5.3+中使用它,你必须将first Wednesday $y-$m-01更改为first Wednesday of $y-$m-01(请注意“of”)。此外,就像在DateTime版本中一样,不包括结束日期。


进一步阅读:

答案 1 :(得分:4)

您可以尝试这样的事情:

function getWednesdays($month, $year) {
    $base_date = strtotime($year . '-' . $month . '-01');
    $wed = strtotime('first wed of ' . date('F Y', $base_date));

    $wednesdays = array();

    do {
        $wednesdays[] = new DateTime(date('r', $wed));
        $wed = strtotime('+7 days', $wed);
    } while (date('m', $wed) == $month);

    return $wednesdays;
}

答案 2 :(得分:3)

使用此功能可获得一个月内的任何天数

    function getTotalDays($year, $month, $day){
        $from = $year."-".$month."-01";
        $t=date("t",strtotime($from));

        for($i=1; $i<$t; $i++){
           if( strtolower(date("l",strtotime($year."-".$month."-".$i)))== $day){
             $count++;
          }
      }
      return $count;
 }

像这样使用getTotalDays(&#39; 2014&#39;,&#39; 08&#39;,&#39;星期一&#39;);

将输出4

但如果你想在特定日期的一个月内的所有日期,那么使用此功能

    function getTotalDatesArray($year, $month, $day){
        $date_ar=array();
        $from = $year."-".$month."-01";
        $t=date("t",strtotime($from));

        for($i=1; $i<$t; $i++){
           if( strtolower(date("l",strtotime($year."-".$month."-".$i)))== $day){
            $j= $i>9 ? $i: "0".$i;
             $date_ar[]=$year."-".$month."-".$j;
          }
      }
      return $date_ar;
 }

像这样使用getTotalDatesArray(&#39; 2014&#39;,&#39; 08&#39;,&#39;星期一&#39;);

将输出数组([0] =&gt; 2014-08-04 [1] =&gt; 2014-08-11 [2] =&gt; 2014-08-18 [3] =&gt; 2014-08- 25)

答案 3 :(得分:2)

可能有一种更有效的方法,但这可行:

<?php
function isWednesday($day, $month, $year)
{
    if (date('w', $date = mktime(0,0,0,$month,$day,$year)) == 3) {
        return $date;
    }
    return false;
}
function getWednesdays($month, $year)
{
    for ($day=1; $day<=7; $day++) {
        if ($date = isWednesday($day, $month, $year)) {
            break;
        }
    }
    $wednesdays = array();

    while (date('m',$date) == $month) {
        $wednesdays[] = $date;
        $day += 7;
        $date = isWednesday($day, $month, $year);
    }
    return $wednesdays;
}

你可以用这个来测试:

foreach (getWednesdays($argv[1], $argv[2]) as $date) {
    echo date("Y-m-d\n", $date);
}

$ php wednesdays.php 11 2010
2010-11-03
2010-11-10
2010-11-17
2010-11-24
$ php wednesdays.php 12 2010
2010-12-01
2010-12-08
2010-12-15
2010-12-22
2010-12-29
$ php wednesdays.php 2 2012
2012-02-01
2012-02-08
2012-02-15
2012-02-22
2012-02-29

取值

答案 4 :(得分:2)

<?php
function wednesdays($month, $year)
{
  list($n,$d) = explode('-', date('t-d', strtotime("Wednesday, $year-$month")));
  $days = array();
  while ($d <= $n)
  {
    $days[] = sprintf("%04d-%02d-%02d", $year, $month, $d);
    $d += 7;
  }
  return $days;
}

var_dump(wednesdays(11, 2010));

?>

但我强烈建议您习惯使用PHP 5.3的日期和时间函数。 (见戈登的回答。)

答案 5 :(得分:1)

使用早于5.3的PHP,此解决​​方案不起作用。似乎,第一天时间戳大于最后一天时间戳,最终在第一次终止时终止循环。

由于PHP在午夜计算时差,因此当月份在相关日期开始时,此解决方案不起作用。并且在某些情况下,最后一天也不起作用。

我在以下代码中解决了这些问题。此代码可用于一周中的任何一天。

该解决方案是在此问题的Eli代码的帮助下创建的:Get the First or Last Friday in a Month

///// code starts here /////

function getWeekDates($year, $month, $day){
$tsInMonth = strtotime("$year-$month");
$monthNumber = (int)date("m",$tsInMonth);

$Names = array( 1=>"Sun", 2=>"Mon", 3=>"Tue", 4=>"Wed", 5=>"Thu", 6=>"Fri", 7=>"Sat" );

$ThisMonthTS = strtotime( date("Y-m-01", $tsInMonth ) );
$NextMonthTS = strtotime( date("Y-m-01", strtotime("next month", $tsInMonth) ) );

$weekDates = array();

for($Ord=1;$Ord<=5;$Ord++){
    $DateOfInterest = (-1 == $Ord) 
        ? strtotime( "last ".$Names[$day], $NextMonthTS ) 
        : strtotime( $Names[$day]." + ".($Ord-1)." weeks", $ThisMonthTS );

    ($Ord==5 && (int)date("m",$DateOfInterest)==(int)date("m",$NextMonthTS))
        ? false
        : $weekDates [] = $DateOfInterest;
}

return $weekDates;
}

///// Usage /////

foreach (getWeekDates("2010", "2", "2") as $day) {
    echo "<br>" . date("l, Y-m-d", $day);
}

///// End of code /////

我希望它有所帮助。

答案 6 :(得分:1)

我已经重新编写了@ Gordon的解决方案以适应任何一天

function get_dates_of_day($y, $m, $day_name)
{
    return new DatePeriod(
        new DateTime("first $day_name of $y-$m"),
        DateInterval::createFromDateString("next $day_name"),
        new DateTime("next month $y-$m-01")
        );
}

现在你可以做get_dates_of_day('2015','08','wednesday') 并使用相同的方法来获取给定月份中任何一天的日期。

答案 7 :(得分:0)

我为此目的编写了以下代码......并且它完全适合我

function get_month_date($year, $month, $day) {
$monthdays = date('t', mktime(0, 0, 0, $month, 1, $year));
$dates = array();
for($i = 0; $i <= $monthdays; $i++ ) {
    if($day == date('l', mktime(0, 0, 0, $month, 1+$i, $year)) && $month == date('n', mktime(0, 0, 0, $month, 1+$i, $year))) {
    $dates[] = date('Y-m-d', mktime(0, 0, 0, $month, 1+$i, $year));
    }
}
return $dates; }

我们可以将它用作:

$days = get_month_date($year, $month, 'Wednesday');

它将返回给定月份和年份的星期三所有日期的数组

答案 8 :(得分:0)

以下是样本

function getSundays($y,$m){ 
    $date = "$y-$m-01";
    $first_day = date('N',strtotime($date));
    $first_day = 7 - $first_day + 1;
    $last_day =  date('t',strtotime($date));
    $days = array();
    for($i=$first_day; $i<=$last_day; $i=$i+7 ){
        $days[] = $i;
    }
    return  $days;
}

$days = getSundays(2016,04);
print_r($days);

答案 9 :(得分:0)

  

尝试使用这个来获取当月的所有星期三。

$month  = date('m');
$year  = date('Y');
function getDays($year,$month){ 
 $days = cal_days_in_month(CAL_GREGORIAN, $month,$year);
 $wed = array();
 for($i = 1; $i<= $days; $i++){
 $day  = date('Y-m-'.$i);
 $result = date("D", strtotime($day));
 if($result == "Wed"){  
 $wed[] = date("Y-m-d", strtotime($day)). " ".$result."<br>";
 }  
}
 return  $wed;
}
$wed = getDays($year,$month);
print_r($wed);

答案 10 :(得分:-2)

如果没有给出DateTime,你需要知道一个日期的日期 - 例如unix时代的开始(1970年1月1日)。

从那里开始,你只需找到第一个星期三,然后从那里找到你的月份。请记住闰年,你很好。

显然,它不是世界上最有效的算法,但它可以完成这项任务。