S.M_Emamian
S.M_Emamian

Reputation: 17383

How to get friday dates between two time intervals

I would like to get all Friday dates from two-time intervals. My framework is laravel.

my function:

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

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

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

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

    return $dates;
}

but from two dates it returns:

"["2017-12-25","2018-01-01","2018-01-08","2018-01-15","2018-01-22","2018-01-29","2018-02-05","2018-02-12","2018-02-19","2018-02-26","2018-03-05","2018-03-12","2018-03-19","2018-03-26","2018-04-02","2018-04-09","2018-04-16","2018-04-23","2018-04-30","2018-05-07","2018-05-14","2018-05-21","2018-05-28","2018-06-04","2018-06-11","2018-06-18","2018-06-25","2018-07-02","2018-07-09","2018-07-16","2018-07-23","2018-07-30","2018-08-06","2018-08-13","2018-08-20","2018-08-27","2018-09-03","2018-09-10","2018-09-17","2018-09-24","2018-10-01","2018-10-08","2018-10-15","2018-10-22","2018-10-29","2018-11-05","2018-11-12","2018-11-19","2018-11-26","2018-12-03","2018-12-10","2018-12-17","2018-12-24","2018-12-31"]"

where is my problem?

Upvotes: 3

Views: 636

Answers (3)

gview
gview

Reputation: 15361

It seems that you aren't interested in what your issue was, but your original code was easily fixed:

<?php

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

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

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

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

    return $dates;
}

var_dump(getFridaysInRange('2017-11-28', '2018-03-31'));

The main problem was your constant check on the day of the week, should have been 5 (assuming you are checking for Friday).

I also reordered your check for dateFrom > dateTo, as once you modify the dateFrom, you could actually push it past the dateTo, and that is what you are trying to catch there.

Output:

array(18) {
  [0]=>
  string(10) "2017-12-01"
  [1]=>
  string(10) "2017-12-08"
  [2]=>
  string(10) "2017-12-15"
  [3]=>
  string(10) "2017-12-22"
  [4]=>
  string(10) "2017-12-29"
  [5]=>
  string(10) "2018-01-05"
  [6]=>
  string(10) "2018-01-12"
  [7]=>
  string(10) "2018-01-19"
  [8]=>
  string(10) "2018-01-26"
  [9]=>
  string(10) "2018-02-02"
  [10]=>
  string(10) "2018-02-09"
  [11]=>
  string(10) "2018-02-16"
  [12]=>
  string(10) "2018-02-23"
  [13]=>
  string(10) "2018-03-02"
  [14]=>
  string(10) "2018-03-09"
  [15]=>
  string(10) "2018-03-16"
  [16]=>
  string(10) "2018-03-23"
  [17]=>
  string(10) "2018-03-30"
}

Upvotes: 1

Alexey Mezenin
Alexey Mezenin

Reputation: 163768

You could use Carbon:

$dateTo = Carbon::parse($dateToString);
$friday = Carbon::parse($dateFromString . ' next friday');
$fridays = [];

while($friday->lt($dateTo)) {
    $fridays[] = $friday->toDateString();
    $friday->addWeek();
}

return $fridays;

Upvotes: 2

Tommaso Belluzzo
Tommaso Belluzzo

Reputation: 23675

Try the following function:

function getWeekDays($start, $end, $weekday)
{
    $start = strtotime($start);
    $end = strtotime($end);

    $weekdays = array();

    while (date("w", $start) != $weekday) {
        $start += 86400;
    }

    while ($start <= $end)
    {
        $weekdays[] = date('Y-m-d', $start);
        $start += 604800;
    }

    return($weekdays);
}

Example:

// get all fridays between 1st November 2017 and 1st December 2017
print_r(getWeekDays('2017-11-01','2017-12-01', 5));

Output:

Array
(
    [0] => 2017-11-03
    [1] => 2017-11-10
    [2] => 2017-11-17
    [3] => 2017-11-24
    [4] => 2017-12-01
)

Visit this link to test a full working demo of the script.

Upvotes: 1

Related Questions