Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

marknt15's avatar

PHP Weekly date range with specific start and end day

Hi I already have a date range result but how can I make the date range start at every Thursday and ends at Wednesday. Thanks for your help :smiley:

$week_range = '';
for ($i = 0; $i <= 4; $i++) {
    $k = $i - 1;

    $ymd_week_range = date('Y-m-d', strtotime("-$i week")) . ',' . date('Y-m-d', strtotime("-$k week -1 day"));

    $day_from = date('j', strtotime("-$i week"));
    $day_to = date('j', strtotime("-$k week -1 day"));
    $month_to = date('M', strtotime("-$i week"));
    $month_from = date('M', strtotime("-$k week -1 day"));
    $year_to = date('Y', strtotime("-$i week"));
    $year_from = date('Y', strtotime("-$k week -1 day"));

    $weeks[$ymd_week_range] = "$month_from $day_from-$day_to, $year_to";   
}
Array
    (
        [2017-03-16,2017-03-22] => Mar 16-22, 2017
        [2017-03-09,2017-03-15] => Mar 9-15, 2017
        [2017-03-02,2017-03-08] => Mar 2-8, 2017
        [2017-02-23,2017-03-01] => Mar 23-1, 2017
        [2017-02-16,2017-02-22] => Feb 16-22, 2017
    )

So today is thursday so it is correct. But if today is friday then the result is wrong. If today is friday then I want the correct result above. The wrong result is:

Array
        (
            [2017-03-17,2017-03-23] => Mar 17-23, 2017
            [2017-03-10,2017-03-16] => Mar 10-16, 2017
            [2017-03-03,2017-03-09] => Mar 3-9, 2017
            [2017-02-24,2017-03-02] => Mar 24-2, 2017
            [2017-02-17,2017-02-23] => Feb 17-23, 2017
        )
0 likes
4 replies
Cronix's avatar

Check if today is Thursday and if not, get next Thursday? Something like

if (date('w') === 4)) // today is Thursday, use today
else strtotime('next Thursday') // Start this next Thursday
marknt15's avatar

Thanks for the tip. I think it is working correctly now by doing this revision:

for ($i = 0; $i <= 4; $i++) {
    $k = $i - 1;

    $from_text = strtotime("this week thursday -$i week");
    $to_text = strtotime("-$k week -1 day");

    $ymd_week_range = date('Y-m-d', $from_text) . ',' . date('Y-m-d', $to_text);

    $day_from = date('j', $from_text);
    $day_to = date('j', $to_text);

    $month_from = date('M', $from_text);
    $month_to = date('M', $to_text);

    $year_from = date('Y', $from_text);
    $year_to = date('Y', $to_text);

    $weeks[$ymd_week_range] = "$month_from $day_from - $month_to $day_to, $year_to";
}

I changed my laptop date and set it to tomorrow (Friday) and the results are now correct using the code above:

Array
(
    [2017-03-16,2017-03-23] => Mar 16 - Mar 23, 2017
    [2017-03-09,2017-03-16] => Mar 9 - Mar 16, 2017
    [2017-03-02,2017-03-09] => Mar 2 - Mar 9, 2017
    [2017-02-23,2017-03-02] => Feb 23 - Mar 2, 2017
    [2017-02-16,2017-02-23] => Feb 16 - Feb 23, 2017
)
marknt15's avatar

Posting the correct and final answer for future reference:

$weeks          = array();
$dayOfWeek      = date('w');
$thursday       = 4;
$diff           = $thursday - $dayOfWeek;
$minus_weeks    = 12; // past 3 months

// create week range that starts with Thursday and ends with Wednesday for the past 3 months
for ($i = 0; $i <= $minus_weeks; $i++) {

    $k = $i - 1;

    $from_formula   = strtotime("-$i week $diff day");
    $to_formula     = strtotime("-$k week " . ($diff - 1) . " day");
    $ymd_week_range = date('Y-m-d', $from_formula) . ',' . date('Y-m-d', $to_formula);

    $day_from   = date('j', $from_formula);
    $day_to     = date('j', $to_formula);

    $month_from = date('M', $from_formula);
    $month_to   = date('M', $to_formula);

    $year_from  = date('Y', $from_formula);
    $year_to    = date('Y', $to_formula);

    $weeks[$ymd_week_range] = "$month_from $day_from - $month_to $day_to";
}
emman's avatar

markn15 ... may i see your code how did you get a date range.. im stuck at it.. newbie here,.. ty..

Please or to participate in this conversation.