Как найти ближайший день недели в php?

Как найти ближайший ближайший день недели в PHP, если изначально у меня есть строка даты вроде: 07.05.2010 ? Например, я хочу найти ближайшее воскресенье (или любой день недели). Как я могу это реализовать? благодаря

Это должно сделать:

 echo date('dmY', strtotime('next Sunday', strtotime('07.05.2010'))); 

На всякий случай, если вам нужен ближайший день, а не следующий , вот способ сделать это.

 $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("dmY"); 

А с PHP 5.3 эта средняя часть может быть просто

 $date = DateTime::createFromFormat("!dmY", $date) ->modify("-4 days")->modify("next $target"); 
 /** * * @param \DateTime $date * @param $dayOfWeek - eg 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; } 

В качестве альтернативы вы можете создать карту того, какие дни недели ближе, например, если вы после ближайшего понедельника по среду, было бы быстрее просто найти предыдущий понедельник, учитывая, что он ближе, чем в следующий понедельник.

Отправлено несколько ответов, и я вижу решения, которые могут дать мне либо следующий экземпляр дня недели, либо предыдущего экземпляра, но не самый близкий . Чтобы решить эту проблему, я воспользовался этой функцией:

 function closestDate($day){ $day = ucfirst($day); if(date('l', time()) == $day) return date("Ymd", time()); else if(abs(time()-strtotime('next '.$day)) < abs(time()-strtotime('last '.$day))) return date("Ymd", strtotime('next '.$day)); else return date("Ymd", strtotime('last '.$day)); } 

Вход: день недели («воскресенье», «понедельник» и т. Д.)

Выход: если бы я попросил ближайшее «воскресенье» и сегодня:

  1. «Воскресенье»: я получу сегодняшнюю дату
  2. «Понедельник»: я получу вчерашнюю дату
  3. «Суббота: я получу дату завтра

Надеюсь это поможет 🙂

strtotime – волшебный

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

Это можно сделать, используя только strtotime() и немного обмануть.

 function findNearest($day, $date) { return strtotime("next $day", strtotime("$date - 4 days")); } echo date('dmY', findNearest("Sunday", "07.05.2010")); // 09.05.2010 echo findNearest("Sunday", "07.05.2010"); // 1273377600 echo date('dmY', findNearest("Sunday", "09.05.2010")); // 09.05.2010 echo findNearest("Sunday", "09.05.2010"); // 1273377600 echo date('dmY', findNearest("Sunday", "05.05.2010")); // 02.05.2010 echo findNearest("Sunday", "05.05.2010"); // 1272772800 

Вы также можете использовать библиотеку Carbon

 $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