php function for get all mondays within date range
Asked Answered
M

10

19

Example: $startDate is Monday 2007-02-05 and $endDate is Tuesday 2007-02-20. Then I want it to list:

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

I looked at the PHP manual and found this to get all the days between two dates. But how to do it the way i want? PHP Code:

Metastasize answered 15/8, 2011 at 4:53 Comment(1)
Where's the code to go after "PHP Code:"?Atypical
P
45

Rather than get all days and loop through them all, get the first Monday after the start date and then iterate 7 days at a time:

$endDate = strtotime($endDate);
for($i = strtotime('Monday', strtotime($startDate)); $i <= $endDate; $i = strtotime('+1 week', $i))
    echo date('l Y-m-d', $i);
Peeples answered 15/8, 2011 at 5:4 Comment(3)
you should use strtotime("+1 week", $i) instead of adding magic number 604800, otherwise will be a trouble with daylight saving time.Peonir
You'll skip $endDate if it's a monday.Peonir
And the last thing: "strtotime($endDate)" will be calculated on the each step, it's better to introduce a new variable and put it into the first section: for ($i=.., $n=strtotime(); $i <= $n; ...)Peonir
K
14

I needed the same and created a simple method.

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

Then use it.

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

Result:

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

Maybe it will be helpful for somebody.

Kazak answered 18/5, 2016 at 12:54 Comment(0)
L
8

You can use below function to get a array of dates between a date range of specific day.

You have to input start date, end date and day number in number.The day number is as follow. 1 = Monday, 2 = Tuesday, 3 = Wednesday, 4 = Thursday. 5 = Friday, 6 = Saturday, 7 = Sunday.

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;
 }
Landtag answered 25/10, 2015 at 11:11 Comment(1)
How can I convert this to make it accept array of day number e.g. return Monday, Tuesday, Wednesday etc?Chalutz
A
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
}
Atypical answered 15/8, 2011 at 5:0 Comment(0)
S
2

i Create A class, You get All Days In range Date Group By Name of Day:

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

The Output will be like this

 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)
Sink answered 4/12, 2016 at 13:28 Comment(0)
W
2

I made some changes to response https://mcmap.net/q/627746/-php-function-for-get-all-mondays-within-date-range

Then I can get the days between dates for any day and return format.

    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;
    }
Whish answered 20/4, 2020 at 10:12 Comment(0)
L
1

This is code for fetching the weekday of "$startdate" and counting the number of weekdays between two dates.


`$startdate` = '2015-03-01';
`$endate` = '2015-03-31';
`$recurringDay` = date('N', strtotime($startdate)); // recurring Day from date i.e monday = 1, Tuesday = 2 ...etc
$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; // counter starts

   foreach($day as $key=>$dt) {

    if ($dt==`$recurringDay`) // compare it 
    {
      $k[] = $key;
      $c++;
    }
   }

   `$nofDays` = $c; // number of mondays , tuesday

   foreach($k as $pp) {
       //adding session code
       `$recurringDatetime[]` = $period[$pp]; // recurring dates
       }

       print_r(`$recurringDatetime`); // array of dates of monday, tuesday ..etc
Leeway answered 17/3, 2015 at 14:3 Comment(1)
This is code for Fetching Weekday of "$startdate" and number of Weekdays exists between two dates.Leeway
M
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); }

I had similar issue and courses can start on any day. This script picks starting day and collect next days every week until the wanted amount (12 in this case).

Memorialize answered 1/11, 2017 at 22:0 Comment(0)
C
0

Convert $startDate and $endDate before that to timestamps:

foreach ($date = $startDate; $date <= $endDate; $date += 60 * 60 * 24) {
    if (strftime('%w', $date) == 1) {
        $mondays[] = strftime('%A %Y-%m-%d', $date);
    }
}
Concentric answered 15/8, 2011 at 5:3 Comment(0)
B
0

simply you can add as,

$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
Boaten answered 15/9, 2019 at 12:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.