获取日期范围内所有周一的PHP函数

19

示例: $startDate 是周一 2007-02-05,$endDate 是周二 2007-02-20。然后我想要列出:

Monday 2007-02-05
Monday 2007-02-12
Monday 2007-02-19

我查看了 PHP 手册并找到了以下代码以获取两个日期之间的所有天数。但我该如何按照我的方式来实现呢?PHP 代码:


5
“PHP Code:”之后的代码在哪里? - Dan Grossman
10个回答

45

不必获取所有日期并遍历它们,而是获取开始日期后的第一个星期一,然后每次迭代7天:

$endDate = strtotime($endDate);
for($i = strtotime('Monday', strtotime($startDate)); $i <= $endDate; $i = strtotime('+1 week', $i))
    echo date('l Y-m-d', $i);

4
你应该使用strtotime("+1 week", $i),而不是添加魔法数字604800,否则在夏令时的时候可能会出现问题。 - realmfoo
4
如果 $endDate 是周一,你将跳过它。 - realmfoo
3
最后一件事:“strtotime($endDate)”将在每个步骤中计算,最好引入一个新变量并将其放入第一部分:for ($i=.., $n=strtotime(); $i <= $n; ...) - realmfoo

14

我需要相同的东西,所以创建了一个简单的方法。

public function getMondaysInRange($dateFromString, $dateToString)
{
    $dateFrom = new \DateTime($dateFromString);
    $dateTo = new \DateTime($dateToString);
    $dates = [];

    if ($dateFrom > $dateTo) {
        return $dates;
    }

    if (1 != $dateFrom->format('N')) {
        $dateFrom->modify('next monday');
    }

    while ($dateFrom <= $dateTo) {
        $dates[] = $dateFrom->format('Y-m-d');
        $dateFrom->modify('+1 week');
    }

    return $dates;
}

那么使用它。

$dateFromString = '2007-02-05';
$dateToString = '2007-02-20';
var_dump($this->getMondaysInRange($dateFromString, $dateToString));

结果:

array (size=3)
  0 => string '2007-02-05' (length=10)
  1 => string '2007-02-12' (length=10)
  2 => string '2007-02-19' (length=10)

也许对某些人会有帮助。


8
您可以使用以下函数获取特定日期范围内特定星期的日期数组。
您需要以数字输入开始日期、结束日期和日期对应的星期数。星期对应数字如下: 1 = 星期一,2 = 星期二,3 = 星期三,4 = 星期四,5 = 星期五,6 = 星期六,7 = 星期日。
function getDateForSpecificDayBetweenDates($startDate,$endDate,$day_number){
$endDate = strtotime($endDate);
$days=array('1'=>'Monday','2' => 'Tuesday','3' => 'Wednesday','4'=>'Thursday','5' =>'Friday','6' => 'Saturday','7'=>'Sunday');
for($i = strtotime($days[$day_number], strtotime($startDate)); $i <= $endDate; $i = strtotime('+1 week', $i))
$date_array[]=date('Y-m-d',$i);

return $date_array;
 }

1
我该如何修改代码以接受一组星期数字并返回星期名称,例如:Monday、Tuesday、Wednesday等? - Abu Nooh

3
for ($i = strtotime($startDate); $i <= strtotime($endDate); $i = strtotime('+1 day', $i)) {
  if (date('N', $i) == 1) //Monday == 1
    echo date('l Y-m-d', $i); //prints the date only if it's a Monday
}

2

创建一个类,您可以获得在范围内的所有日期以星期几为组的名称:

 class DayHelper{

      const MONDAY = 'Mon';
      const TUESDAY = 'Tue';
      const WEDENSDAY = 'Wed';
      const THURSDAY = 'Thu';
      const FRIDAY = 'Fri';
      const SATURDAY = 'Sat';
      const SUNDAY = 'Sun';

   public function GetYeardays($dateStart, $dateend){
    $period = new \DatePeriod(
            new \DateTime($dateStart), new \DateInterval('P1D'), (new \DateTime($dateend))
    );
    $dates = iterator_to_array($period);

    $arrayreturn = array();
    foreach ($dates as $val) {
        $date = $val->format('Y-m-d'); //format date
        $get_name = date('l', strtotime($date)); //get week day
        $day_name = substr($get_name, 0, 3); // Trim day name to 3 chars
        switch ($day_name) {
            case self::MONDAY:
                $MONDAY[] = $date;
                $arrayreturn[self::MONDAY] = $MONDAY;
                break;
            case self::TUESDAY:
                $TUESDAY[] = $date;
                $arrayreturn[self::TUESDAY] = $TUESDAY;
                break;
            case self::WEDENSDAY:
                $WEDENSDAY[] = $date;
                $arrayreturn[self::WEDENSDAY] = $WEDENSDAY;
                break;
            case self::THURSDAY:
                $THURSDAY[] = $date;
                $arrayreturn[self::THURSDAY] = $THURSDAY;
                break;
            case self::FRIDAY:
                $FRIDAY[] = $date;
                $arrayreturn[self::FRIDAY] = $FRIDAY;
                break;
            case self::SATURDAY:
                $SATURDAY[] = $date;
                $arrayreturn[self::SATURDAY] = $SATURDAY;
                break;
            case self::SUNDAY:
                $SUNDAY[] = $date;
                $arrayreturn[self::SUNDAY] = $SUNDAY;
                break;
        }
    }
    return $arrayreturn;
  }
} 

输出结果将如下所示。
 array (size=7)
 'Fri' => 
  array (size=5)
  0 => string '2016/01/01' (length=10)
  1 => string '2016/01/08' (length=10)
  2 => string '2016/01/15' (length=10)
  3 => string '2016/01/22' (length=10)
  4 => string '2016/01/29' (length=10)
 'Sat' => 
array (size=5)
  0 => string '2016/01/02' (length=10)
  1 => string '2016/01/09' (length=10)
  2 => string '2016/01/16' (length=10)
  3 => string '2016/01/23' (length=10)
  4 => string '2016/01/30' (length=10)
 'Sun' => 
array (size=4)
  0 => string '2016/01/03' (length=10)
  1 => string '2016/01/10' (length=10)
  2 => string '2016/01/17' (length=10)
  3 => string '2016/01/24' (length=10)
 'Mon' => 
array (size=4)
  0 => string '2016/01/04' (length=10)
  1 => string '2016/01/11' (length=10)
  2 => string '2016/01/18' (length=10)
  3 => string '2016/01/25' (length=10)
 'Tue' => 
array (size=4)
  0 => string '2016/01/05' (length=10)
  1 => string '2016/01/12' (length=10)
  2 => string '2016/01/19' (length=10)
  3 => string '2016/01/26' (length=10)
 'Wed' => 
array (size=4)
  0 => string '2016/01/06' (length=10)
  1 => string '2016/01/13' (length=10)
  2 => string '2016/01/20' (length=10)
  3 => string '2016/01/27' (length=10)
  'Thu' => 
array (size=4)
  0 => string '2016/01/07' (length=10)
  1 => string '2016/01/14' (length=10)
  2 => string '2016/01/21' (length=10)
  3 => string '2016/01/28' (length=10)

2

我对响应进行了一些更改,详情请参见 https://dev59.com/fWw05IYBdhLWcg3wv0N6#37300272

这样,我就可以获取任何日期之间的天数并返回格式。

    public function getWeekDayInRange($weekday, $dateFromString, $dateToString, $format = 'Y-m-d')
    {
        $dateFrom = new \DateTime($dateFromString);
        $dateTo = new \DateTime($dateToString);
        $dates = [];

        if ($dateFrom > $dateTo) {
            return $dates;
        }

        if (date('N', strtotime($weekday)) != $dateFrom->format('N')) {
            $dateFrom->modify("next $weekday");
        }

        while ($dateFrom <= $dateTo) {
            $dates[] = $dateFrom->format($format);
            $dateFrom->modify('+1 week');
        }

        return $dates;
    }

1
$dates = array();
$dates[] = strtotime($start);
for($i = 0; $i <= 12; $i++){
    $dates[] = strtotime('+1 week', $dates[$i]);
}
foreach($dates as $date){ echo date("d.m.Y", $date); }

我遇到了类似的问题,课程可以在任何一天开始。这个脚本会选择起始日期,并每周收集接下来的日期,直到达到想要的数量(在这种情况下为12天)。

1

这是获取"$startdate"的工作日并计算两个日期之间工作日数量的代码。

`$startdate` = '2015-03-01';
`$endate` = '2015-03-31';
`$recurringDay` = date('N', strtotime($startdate)); // 从日期中获取重复的星期几,例如星期一=1,星期二=2等
$begin = new DateTime(`$startdate`);
    $end = new DateTime(date('Y-m-d',strtotime('+1 day', strtotime($endate))));
    while($begin format('Y-m-d');
        $day[] = $begin->format('N');
        $begin->modify('+1 day');
    }
   $c=0; // 计数器开始
foreach($day as $key=>$dt) {
if ($dt==`$recurringDay`) // 进行比较 { $k[] = $key; $c++; } }
`$nofDays` = $c; // 星期一、星期二等的数量
foreach($k as $pp) { //添加会话代码 `$recurringDatetime[]` = $period[$pp]; // 重复的日期 }
print_r(`$recurringDatetime`); // 星期一、星期二等的日期数组

这是获取"$startdate"的工作日以及两个日期之间存在的工作日数量的代码。 - saurabh

0

在此之前将 $startDate 和 $endDate 转换为时间戳:

foreach ($date = $startDate; $date <= $endDate; $date += 60 * 60 * 24) {
    if (strftime('%w', $date) == 1) {
        $mondays[] = strftime('%A %Y-%m-%d', $date);
    }
}

0

你可以简单地添加如下代码:

$date_from = "2007-02-05";
$date_from = strtotime($date_from);

$date_to="2007-02-20";
$date_to = strtotime($date_to);

for ($i=$date_from; $i<=$date_to; $i+=86400) {
$day = date("Y-m-d", $i);
$unixTimestamp = strtotime($day);

$dayOfWeek = date("l", $unixTimestamp);

if ($dayOfWeek == "Monday") {
    echo $day ."is a". $dayOfWeek;
}
}//end for

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接