How to find nearest day of week in php?

你离开我真会死。 提交于 2019-11-28 10:08:43

This should do:

echo date('d.m.Y', strtotime('next Sunday', strtotime('07.05.2010')));

Just in case you wanted the nearest day rather than the next one, here is a way to do that.

$target = "Sunday";
$date   = "07.05.2010";

// Old-school DateTime::createFromFormat
list($dom, $mon, $year) = sscanf($date, "%02d.%02d.%04d");
$date = new DateTime("$year/$mon/$dom -4 days");
// Skip ahead to $target day
$date->modify("next $target");

echo $date->format("d.m.Y");

And as of PHP 5.3, that middle portion can be simply

$date = DateTime::createFromFormat("!d.m.Y", $date)
        ->modify("-4 days")->modify("next $target");
/**
 *
 * @param \DateTime $date
 * @param $dayOfWeek - e.g Monday, Tuesday ...
 */
public function findNearestDayOfWeek(\DateTime $date, $dayOfWeek)
{
    $dayOfWeek = ucfirst($dayOfWeek);
    $daysOfWeek = array(
        'Monday',
        'Tuesday',
        'Wednesday',
        'Thursday',
        'Friday',
        'Saturday',
        'Sunday',
    );
    if(!in_array($dayOfWeek, $daysOfWeek)){

        throw new \InvalidArgumentException('Invalid day of week:'.$dayOfWeek);
    }
    if($date->format('l') == $dayOfWeek){

        return $date;
    }

    $previous = clone $date;
    $previous->modify('last '.$dayOfWeek);

    $next = clone $date;
    $next->modify('next '.$dayOfWeek);

    $previousDiff = $date->diff($previous);
    $nextDiff = $date->diff($next);

    $previousDiffDays = $previousDiff->format('%a');
    $nextDiffDays = $nextDiff->format('%a');

    if($previousDiffDays < $nextDiffDays){

        return $previous;
    }

    return $next;
}

Alternatively you could create a map of what days of weeks are closer, e.g if you're after closest Monday to Wednesday, it would be faster to just find the previous Monday given that it's closer than the next Monday.

There are several answers posted and I keep seeing solutions that could give me either the next instance of a day of the week or the previous instance but not the closest. To address this, I came up with this function:

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 :)

strtotime is magical

echo date("d/m/y", strtotime("next sunday", strtotime("07.05.2010")  ) );

This can be done using only strtotime() and a little trickery.

function findNearest($day, $date)
{
    return strtotime("next $day", strtotime("$date - 4 days"));
}

echo date('d.m.Y', findNearest("Sunday", "07.05.2010")); // 09.05.2010
echo               findNearest("Sunday", "07.05.2010");  // 1273377600
echo date('d.m.Y', findNearest("Sunday", "09.05.2010")); // 09.05.2010
echo               findNearest("Sunday", "09.05.2010");  // 1273377600
echo date('d.m.Y', findNearest("Sunday", "05.05.2010")); // 02.05.2010
echo               findNearest("Sunday", "05.05.2010");  // 1272772800

You can use Carbon library as well

$date = Carbon::create(2015, 7, 2); // 2015-07-02

// To get the first day of the week 
$monday = $date->startOfWeek(); // 2015-06-29

$mondayTwoWeeksLater = $date->addWeek(2); // 2015-07-13
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!