如何在PHP中找到最近的星期几?

12
如何在PHP中查找特定的最近一周日期,如果最初我有一个日期字符串,例如:07.05.2010?例如,我想找到最近的星期日(或任何一周的日子)。我该如何实现?谢谢。

你是在寻求算法吗?如果是,能否明确所需的输入/输出? - Dolph
1
你可能会觉得这个解决方案很有趣:http://is.gd/bXrha - nuqqsa
@nuqqsa 在我看来,Zend_Date使用起来真是太麻烦了。 - Gordon
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");

天啊,我把事情搞得太复杂了。不错 +1 - Gordon

13

这样应该可以:

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

如果输入的是德国日期格式 MM.DD.YYYY,strtotime函数将无法正确处理。你需要找到解决方案才能得到我的点赞 :) - Pekka
6
请确保测试边缘情况。如果07.05.2010本身是星期天会发生什么? - Pekka
14
“下个星期天”不一定是“最近的星期天”。 - Dolph
请要求用户以正确的格式输入日期,否则您将无法确定用户输入的是05/07还是07/05。 - Nikola Sivkov
谢谢,即使日期是星期天,它也起作用了。我真不应该不知道“strtotime”的“next %dayofweek%”方法... - moogeek
1
那么你说的“nearest”实际上是指“next”吗? - salathe

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

或者您可以创建一个表格,来确定更接近的星期几。例如,如果您需要找到最接近周三的周一,那么找到上一个周一会比找下一个周一更快。


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

你也可以使用 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

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

strtotime 是神奇的

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接