2010-05-06 2 views
8

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

+0

Вы просите алгоритм? Если да, можете ли вы указать требуемый ввод/вывод? – Dolph

+0

Да, хотя – moogeek

+1

Вы можете найти это решение интересным: http://is.gd/bXrha – nuqqsa

ответ

8

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

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

Не, если последний является форматом немецкого формата MM.DD.YYYY - strtotime будет винт, что вверх. Вам нужно будет найти решение для этого, чтобы получить мое преимущество :) –

+3

Плюс, не забудьте проверить края. Что произойдет, если сам 07.05.2010 - воскресенье? –

+9

«Следующее воскресенье» не обязательно «ближайшее воскресенье» – Dolph

0

strtotime волшебно

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

Кто скажет, что * следующий * Воскресенье ближайший? .. – salathe

13

Только в случае, если вы хотели ближайший день, а не следующего один, вот способ сделать что.

$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"); 
+0

geez, я был слишком расстроен. Nice +1 – Gordon

+0

вам понравится мое редактирование тогда :-) – salathe

1

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

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

} 

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

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

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

Надеется, что это помогает :)

0

Это может быть сделано с использованием только 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 
0

Вы можете использовать библиотеку 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 
2
/** 
* 
* @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; 
} 

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

Смежные вопросы