Как найти ближайший день недели в php?
Как найти конкретный ближайший день недели в PHP, если изначально у меня есть строка даты, такая как: 07.05.2010
? Например, я хочу найти ближайшее воскресенье (или любой день недели). Как я могу это реализовать? Спасибо
7 ответов:
Просто на случай, если вы хотите, чтобы ближайший день, а не Следующий, вот способ сделать это.
$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");
И начиная с PHP 5.3, эта средняя часть может быть Просто
$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; }
Есть несколько опубликованных ответов, и я продолжаю видеть решения, которые могут дать мне либо Следующий экземпляр дня недели, либо предыдущий экземпляр , но не ближайший. Чтобы решить эту проблему, я придумал такую функцию:
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)); }
Ввод: день недели ("воскресенье", "понедельник" и т. д.)
Вывод: Если я попросил ближайшее "воскресенье", а сегодня:
- "воскресенье" : я получу сегодняшнюю дату
- "понедельник": я получу вчерашнее дата
- "суббота: я получу завтрашнюю дату
Надеюсь, это поможет :)
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('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