11

最初に次のような日付文字列がある場合、PHP で特定の最も近い曜日を見つける方法: 07.05.2010? たとえば、最も近い日曜日 (または任意の曜日) を見つけたいとします。どうすればこれを実装できますか? ありがとう

4

7 に答える 7

17

の日ではなく最も近い日が必要な場合に備えて、これを行う方法を次に示します。

$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");
于 2010-05-06T21:49:15.970 に答える
12

これは次のことを行う必要があります。

echo date('d.m.Y', strtotime('next Sunday', strtotime('07.05.2010')));
于 2010-05-06T21:08:01.803 に答える
4
/**
 *
 * @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;
}

または、どの曜日がより近いかのマップを作成することもできます。たとえば、月曜日から水曜日に最も近い場合は、次の月曜日よりも近いことを考えると、前の月曜日を見つける方が速くなります。

于 2016-03-15T19:36:01.527 に答える
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
于 2014-08-31T13:14:07.760 に答える
0

strtotimeは魔法です

echo date("d/m/y", strtotime("next sunday", strtotime("07.05.2010")  ) );
于 2010-05-06T21:08:23.727 に答える