Как найти ближайший день недели в php? - PullRequest
9 голосов
/ 07 мая 2010

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

Ответы [ 7 ]

15 голосов
/ 07 мая 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("d.m.Y");

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

$date = DateTime::createFromFormat("!d.m.Y", $date)
        ->modify("-4 days")->modify("next $target");
8 голосов
/ 07 мая 2010

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

echo date('d.m.Y', strtotime('next Sunday', strtotime('07.05.2010')));
2 голосов
/ 15 марта 2016
/**
 *
 * @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;
}

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

1 голос
/ 03 июля 2013

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

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 голосов
/ 26 октября 2015

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

$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
0 голосов
/ 31 августа 2014

Это можно сделать, используя только 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 голосов
/ 07 мая 2010

strtotime магический

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