38
votes

How can I get the date for monday and friday for the current week?

I have the following code, but it fails if current day is sunday or saturday.

$current_day = date("N");
$days_to_friday = 5 - $current_day;
$days_from_monday = $current_day - 1;
$monday = date("Y-m-d", strtotime("- {$days_from_monday} Days"));
$friday = date("Y-m-d", strtotime("+ {$days_to_friday} Days"));
9
Are you counting Sunday as the start or the end of the week?Greg

9 Answers

71
votes

These strtotime inputs work very well:

strtotime( "next monday" );
strtotime( "previous monday" );
strtotime( "today" );
strtotime( "next friday" );
strtotime( "previous friday" );

All you need to do is to wrap the logic inside some if statements.

85
votes

Best solution would be:

$monday = date( 'Y-m-d', strtotime( 'monday this week' ) );
$friday = date( 'Y-m-d', strtotime( 'friday this week' ) );
11
votes

This question needs a DateTime answer:-

/**
 * @param String $day
 * @return DateTime
 */
function getDay($day)
{
    $days = ['Monday' => 1, 'Tuesday' => 2, 'Wednesday' => 3, 'Thursday' => 4, 'Friday' => 5, 'Saturday' => 6, 'Sunday' => 7];

    $today = new \DateTime();
    $today->setISODate((int)$today->format('o'), (int)$today->format('W'), $days[ucfirst($day)]);
    return $today;
}

Usage:

var_dump(getDay('Monday')->format('l dS F Y'));
var_dump(getDay('Friday')->format('l dS F Y'));

Output:

string 'Monday 30th September 2013' (length=26)
string 'Friday 04th October 2013' (length=24)

See it working

1
votes

This really depends on how you define a week but I came up with this function that will give you the date for the nearest "monday" or "friday" (or any day for that matter):

function closestDate($day){

    $day = ucfirst($day);
    if(date('l', time()) == $day)
        return date("Y-m-d", time());
    else if(abs(time()-strtotime('next '.$day)) < abs(time()-strtotime('last '.$day)))
        return date("Y-m-d", strtotime('next '.$day));
    else
        return date("Y-m-d", strtotime('last '.$day));

}

Input: a day of the week ("sunday", "Monday", etc.)

Output: If I asked for the nearest "sunday" and today is:

  1. "Sunday": I will get today's date
  2. "Monday": I will get yesterday's date
  3. "Saturday: I will get tomorrow's date

Hope this helps :)

1
votes

As the top answer suggests, using PHP's strtotime() function is the easiest way.

However, instead of using if statements as he suggests, you could simply reset back to the previous Sunday and grab the dates you require from there.

$monday = strtotime('next monday', strtotime('previous sunday'));
$friday = strtotime('next friday', strtotime('previous sunday'));
1
votes

i use :

$first_week_date = date('d F Y', strtotime('next Monday -1 week', strtotime('this sunday')));
$last_week_date = date('d F Y', strtotime('next Monday -1 week + 4 days', strtotime('this sunday')));
0
votes

I needed a definition of the current week per ISO 8601. I want Monday to always be defined as the Monday that started this current week.

The following solution works excellent for me:

$monday = strtotime(date('o-\WW'));
$friday = strtotime("next friday",$monday);

For $monday, this method will always return the Monday that started this calendar week. unfortunately, this method relies on PHP 5.1 to parse the o date format.

To get any day of the week, you could try:

function time_for_week_day($day_name, $ref_time=null){
    $monday = strtotime(date('o-\WW',$ref_time));
    if(substr(strtoupper($day_name),0,3) === "MON")
        return $monday;
    else
        return strtotime("next $day_name",$monday);
}

Usage:

time_for_week_day('wednesday');
time_for_week_day('friday',strtotime('2014-12-25'));
0
votes

I was looking for a similar thing, except I wanted any Monday, not just this week. This is what I came up with:

function getSunday(DateTime $date){
    $outdate = clone($date);
    $day = $date->format("w");  // get the weekday (sunday is 0)
    $outdate->sub(new DateInterval("P".$day."D")); // subtracting the weekday from the date always gives Sunday 
    return $outdate;
}

It accepts an arbitrary date and gives the Sunday. Then you can easily add back days to get Monday through Saturday.

0
votes

get the current week

        $week = [];
        $saturday = strtotime('saturday this week');
        foreach (range(0, 6) as $day) {
            $week[] = date("Y-m-d", (($day * 86400) + $saturday));
        }