php函数用于获取日期范围内的所有星期一

Nis*_*sha 15 php strtotime

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

Monday 2007-02-05
Monday 2007-02-12
Monday 2007-02-19
Run Code Online (Sandbox Code Playgroud)

我查看了PHP手册,发现这是为了获得两个日期之间的所有日子.但是如何以我想要的方式做到这一点?PHP代码:

Pau*_*aul 38

而不是获取所有日子并循环遍历它们,在开始日期之后获得第一个星期一,然后一次迭代7天:

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

  • 你应该使用strtotime("+ 1周",$ i)而不是添加幻数604800,否则将成为夏令时的麻烦. (4认同)
  • 如果是星期一,你将跳过$ endDate. (4认同)
  • 最后一件事:"strtotime($ endDate)"将在每一步计算,最好引入一个新变量并将其放入第一部分:for($ i = ..,$ n = strtotime(); $ i <= $ n; ...) (3认同)

Sta*_*fox 8

我需要相同的并创建一个简单的方法.

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;
}
Run Code Online (Sandbox Code Playgroud)

然后使用它.

$dateFromString = '2007-02-05';
$dateToString = '2007-02-20';
var_dump($this->getMondaysInRange($dateFromString, $dateToString));
Run Code Online (Sandbox Code Playgroud)

结果:

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

也许对某人有帮助.


NAS*_*SAL 6

您可以使用以下函数获取特定日期的日期范围之间的日期数组.

您必须输入开始日期,结束日期和日期编号.日期编号如下.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;
 }
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 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
}
Run Code Online (Sandbox Code Playgroud)