获取本周星期一和星期五的日期(PHP)

39

如何获取本周星期一和星期五的日期?

我有以下代码,但如果当前是周六或周日,则会失败。

$current_day = date("N");
$days_to_friday = 5 - $current_day;
$days_from_monday = $current_day - 1;
$monday = date("Y-m-d", strtotime("- {$days_from_monday} Days"));
$friday = date("Y-m-d", strtotime("+ {$days_to_friday} Days"));

2
你是把周日算作一周的开始还是结束? - Greg
9个回答

93

最好的解决方案是:

$monday = date( 'Y-m-d', strtotime( 'monday this week' ) );
$friday = date( 'Y-m-d', strtotime( 'friday this week' ) );

4
这个回答比被接受的答案好多了。"this friday"和"next friday"没有区别。你需要使用"这周五"和"下周五"。 - DrDamnit
谢谢。"这个星期" - 正是我在这样的问题中搜索的内容。 - A. Denis
4
“这个星期”是指从周一开始还是从周日开始?由于取决于PHP版本,所以无法确定。请参阅https://3v4l.org/v1ZI7 并单击EOL版本。一些7.x版本会产生意外的结果。 - Salman A

71

这些strtotime输入非常有效:

strtotime( "next monday" );
strtotime( "previous monday" );
strtotime( "today" );
strtotime( "next friday" );
strtotime( "previous friday" );

你需要做的就是将逻辑包装在一些if语句中。


1
不错的答案,但我想从日期中获取星期一。例如,01-01-2012 将返回 2-01-2012。 - chhameed
12
@chhameed: strtotime("next monday", strtotime("2012-01-01"))。第二个参数是参考日期。 - Salman A
如果现在是“星期一”,我们调用strtotime(“previous monday”)会发生什么? - Kelly Elton
@kelly 用户应该检查今天是星期几,并根据结果使用上一个或下一个星期一。当我发布这个答案时,strtotime的周处理非常糟糕。此外,据我所知,PHP不允许您指定一周的第一天...而且没有人知道PHP认为一周的开始是什么。 - Salman A
@SalmanA 我能理解。PHP是一种相当不稳定的语言。 - Kelly Elton

11

这个问题需要一个日期时间的答案:

/**
 * @param String $day
 * @return DateTime
 */
function getDay($day)
{
    $days = ['Monday' => 1, 'Tuesday' => 2, 'Wednesday' => 3, 'Thursday' => 4, 'Friday' => 5, 'Saturday' => 6, 'Sunday' => 7];

    $today = new \DateTime();
    $today->setISODate((int)$today->format('o'), (int)$today->format('W'), $days[ucfirst($day)]);
    return $today;
}

用法:

var_dump(getDay('Monday')->format('l dS F Y'));
var_dump(getDay('Friday')->format('l dS F Y'));

输出:

string 'Monday 30th September 2013' (length=26)
string 'Friday 04th October 2013' (length=24)

点击查看示例


2

我使用:

$first_week_date = date('d F Y', strtotime('next Monday -1 week', strtotime('this sunday')));
$last_week_date = date('d F Y', strtotime('next Monday -1 week + 4 days', strtotime('this sunday')));

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. “星期六”:我将得到明天的日期

希望这可以帮助你 :)


1

正如顶部答案所建议的那样,使用PHP的strtotime()函数是最简单的方法。

然而,与其像他建议的那样使用if语句,你可以简单地重置回上一个星期日并从那里获取所需的日期。

$monday = strtotime('next monday', strtotime('previous sunday'));
$friday = strtotime('next friday', strtotime('previous sunday'));

0

我在寻找类似的东西,但我想要任何一个星期一,而不仅仅是这个星期。这就是我想出来的:

function getSunday(DateTime $date){
    $outdate = clone($date);
    $day = $date->format("w");  // get the weekday (sunday is 0)
    $outdate->sub(new DateInterval("P".$day."D")); // subtracting the weekday from the date always gives Sunday 
    return $outdate;
}

它接受任意日期并给出星期日。然后,您可以轻松地添加回天数以获取周一到周六。


0

我需要一个根据 ISO 8601 定义的当前周的定义。我希望星期一始终被定义为开始这个当前周的星期一。

下面的解决方案对我非常有效:

$monday = strtotime(date('o-\WW'));
$friday = strtotime("next friday",$monday);

对于变量$monday,此方法将始终返回当前日历周的星期一。不幸的是,此方法依赖于PHP 5.1来解析o日期格式。
要获取一周中的任何一天,您可以尝试:
function time_for_week_day($day_name, $ref_time=null){
    $monday = strtotime(date('o-\WW',$ref_time));
    if(substr(strtoupper($day_name),0,3) === "MON")
        return $monday;
    else
        return strtotime("next $day_name",$monday);
}

使用方法:

time_for_week_day('wednesday');
time_for_week_day('friday',strtotime('2014-12-25'));

0

获取当前周

        $week = [];
        $saturday = strtotime('saturday this week');
        foreach (range(0, 6) as $day) {
            $week[] = date("Y-m-d", (($day * 86400) + $saturday));
        }

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