在PHP中获取一周的第一天是什么?

144

在给定日期的MM-dd-yyyy格式下,有人能帮我获取本周第一天吗?


4
你所说的“一周的第一天”是指哪一天?是指星期日还是星期一?还是指一周中第一天的日期? - Jeffrey Hines
2
一周的第一天是固定的:它是星期一(或可能是星期日)。您的意思是要获取给定任意日期之前星期一的日期吗? - Jon Cram
PHP的版本是4还是5? - Jon Cram
3
奇怪,他在寻找DateTime解决方案,而大多数回答并未提供它。 =) - lin
我有一个使用IntlCalendar的答案在这里 - crimson_king
显示剩余2条评论
39个回答

168

这里是我正在使用的代码...

$day = date('w');
$week_start = date('m-d-Y', strtotime('-'.$day.' days'));
$week_end = date('m-d-Y', strtotime('+'.(6-$day).' days'));

$day 包含一个数字,范围从0到6,代表一周中的某一天(星期日=0,星期一=1等)。
$week_start 包含本周星期日的日期,格式为mm-dd-yyyy。
$week_end 包含本周星期六的日期,格式为mm-dd-yyyy。


1
但是,它意味着“本周”的开始和结束,对吗? - Oki Erie Rinaldi
如果给定了周数,我想让它返回该周的开始和结束日期,该怎么办? - Oki Erie Rinaldi
1
@OkiErieRinaldi 你应该开一个新的问题以便得到适当的关注。 - JadedCore
不用担心,我明白了 @JadedCore! - Oki Erie Rinaldi
1
@8ctopus date("N")也可以使用。根据https://www.php.net/manual/en/datetime.format.php,`N`是“星期几的ISO 8601数字表示”。只需要将其递减后即可在此代码中使用。 - Cave Johnson
显示剩余6条评论

94

使用strtotime函数非常简单:

echo date("Y-m-d", strtotime('monday this week')), "\n";   

echo date("Y-m-d", strtotime('sunday this week')), "\n";

这在不同的PHP版本中有所不同

5.3.0-5.6.6,php7@20140507-20150301,hhvm-3.3.1-3.5.1的输出如下:

2015-03-16
2015-03-22

4.3.5 - 5.2.17版本的输出结果:

2015-03-23
2015-03-22

4.3.0 - 4.3.4版本的输出结果

2015-03-30
2015-03-29

比较极端情况

本周等相对描述词有其特定的上下文。以下是在周一或周日时,对本周周一和周日的输出展示:

$date = '2015-03-16'; // monday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n";   
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";

$date = '2015-03-22'; // sunday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n";   
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";

但是它在不同的PHP版本中有所不同:

该输出适用于5.3.0至5.6.6,php7@20140507至20150301,hhvm-3.3.1至3.5.1。

2015-03-16
2015-03-22
2015-03-23
2015-03-29

对于4.3.5 - 5.0.5, 5.2.0 - 5.2.17版本的输出结果

2015-03-16
2015-03-22
2015-03-23
2015-03-22

5.1.0 - 5.1.6版本的输出

2015-03-23
2015-03-22
2015-03-23
2015-03-29

4.3.0 - 4.3.4 版本的输出结果

2015-03-23
2015-03-29
2015-03-30
2015-03-29

为什么对于日期2016-06-05这个不起作用,它给出的是下周的日期。 - user1642018
1
谢谢,我刚刚修改了这段代码,以便可以传递一个可选的日期参数。 $dt = $custom_date ? strtotime($custom_date) : time(); $monday = date("Y-m-d", strtotime('monday this week', $dt)); $sunday = date("Y-m-d", strtotime('sunday this week', $dt)); - Ron Michael

70
strtotime('this week', time());

替换time()。当当前日期是周日/周一时,下一个周日/上一个周一的方法将无法使用。


59
$monday = strtotime('last monday', strtotime('tomorrow')); 可以翻译为:将“明天”这个时间戳作为参数,计算“上周一”的时间戳,并将结果赋值给变量 $monday - Lewis Buckley
如果你需要始终获得上一周的开始日期,那么“this week”无法实现,但是@LewisBuckley的评论可以实现。 - Smar
如果您想指定今天的日期,第二个参数 time() 是可选的。 - Ifnot
对我来说没有起作用,我必须使用略微不同的语法来表示本月累计、本周累计和年初至今。 - Ron
8
这个答案会根据使用的PHP版本产生不一致的结果:http://3v4l.org/Z3k4E @LewisBuckley的解决方案在所有版本中都是一致的:http://3v4l.org/Eeh9c - Chris Baker
@LewisBuckley的回答很好,但可以结合成一个单一的strtotime:strtotime('last Monday tomorrow',$intTimestamp) - Eugene C

57
保持简单:
<?php    
$dateTime = new \DateTime('2020-04-01');
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
$sunday = clone $dateTime->modify('Sunday this week');    
?>

来源:PHP手册

注意:由于某些用户的评论,$dateTime的值将被修改。


2
我这样做是为了避免与您应用程序中可能自动加载的对象发生冲突。这就像绝对路径或相对路径一样。 - job3dot5
9
@Panique - "unknown syntax" 是指 PHP 5.3 的命名空间语法。命名空间允许你在类名前添加一个带反斜杠的命名空间前缀。这里他在没有命名空间的情况下使用它来指定核心的 DateTime 类,这意味着即使当前命名空间中有另一个叫做 DateTime 的类,代码也能正常工作。 - Spudley
感谢您的回答,这是最佳答案。主要是因为作者正在寻求一个“DateTime”解决方案,而大多数答案并没有提供“DateTime”解决方案。 - lin
作为作者寻找DateTime解决方案,这应该是最好的答案! - GuiPab
2
克隆部分未能正常工作。如果您需要原始副本,则应先克隆,然后对克隆进行操作。 - Farid Movsumov
显示剩余2条评论

25
$givenday = date("w", mktime(0, 0, 0, MM, dd, yyyy));

这将给出所提供日期本身的星期几,其中0表示星期日,6表示星期六。从那里,您可以简单地向后计算到您想要的日期。


6
这个答案可以返回给定日期是星期日、星期一等的信息。但是,问题提问者在原问题的评论中要求返回给定日期所在的那周的星期日的日期。 - Rakib

21

这个问题需要一个好的DateTime答案:

function firstDayOfWeek($date)
{
    $day = DateTime::createFromFormat('m-d-Y', $date);
    $day->setISODate((int)$day->format('o'), (int)$day->format('W'), 1);
    return $day->format('m-d-Y');
}

var_dump(firstDayOfWeek('06-13-2013'));
输出:-
string '06-10-2013' (length=10)

这将处理年份边界和闰年。


20

编辑:以下链接不再在所述版本的PHP上运行。它正在运行PHP 5.6,改进了strtotime的可靠性,但并不完美!表格中的结果是来自PHP 5.6的实时结果。

值得一提的是,以下是strtotime确定一致参考帧时的不稳定行为的详细说明:

http://gamereplays.org/reference/strtotime.php

基本上,只有这些字符串可以可靠地给出相同的日期,无论您在调用它们时所处的星期几:

strtotime("next monday");
strtotime("this sunday");
strtotime("last sunday"); 

该文章还提供了一些具体的代码可供使用:$start_of_week = strtotime("next monday - 1 week"); // 将返回本周的星期一,时间为00:00:00" $end_of_week = strtotime("next monday - 1 second"); // 将返回本周的星期日,时间为23:59:59" - Scott M. Stolz

12

假设一周的第一天为星期一,则此代码可行:

echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));

1
"MM-dd-yyyy" 不同于 "Y-m-d",请根据问题的具体情况进行回答。 - Yevgeniy Afanasyev
1
date("MM-dd-yyyy") 的输出结果为:NovNov-0202-15151515。我希望使用 date("M-d-y") 输出可读的日期格式,如:Nov-02-15。 - shasi kanth
"MM-dd-yyyy"来自问题。如果您不确定它的含义,请在问题评论中询问。感谢您修改您的答案。 - Yevgeniy Afanasyev

11

以下代码适用于任何自定义日期,只需使用所需的日期格式即可。

$custom_date = strtotime( date('d-m-Y', strtotime('31-07-2012')) ); 
$week_start = date('d-m-Y', strtotime('this week last monday', $custom_date));
$week_end = date('d-m-Y', strtotime('this week next sunday', $custom_date));
echo '<br>Start: '. $week_start;
echo '<br>End: '. $week_end;

我用 PHP 5.2.17 测试了这段代码,结果如下:

Start: 30-07-2012
End: 05-08-2012

1
值得注意的是,这将始终返回上一个星期一的日期,所以如果 $custom_date 是一个星期一,它将返回一周之前的星期一的日期。 - Hill79
2
无法正常工作,今天是星期天,结果为:开始时间:2013年9月9日,结束时间:2013年9月22日。 - user2019515

9
这个怎么样?
$first_day_of_week = date('m-d-Y', strtotime('Last Monday', time()));
$last_day_of_week = date('m-d-Y', strtotime('Next Sunday', time()));

8
上周一指的是上一个星期一。 - Ikke

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